Cod sursa(job #1965425)

Utilizator tudormaximTudor Maxim tudormaxim Data 14 aprilie 2017 13:27:03
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

ifstream fin ("strmatch.in");
ofstream fout ("strmatch.out");

const int maxn = 2e6 + 5;
char A[maxn], B[maxn];
int Pi[maxn], Ans[maxn], nr, n, m;

void Prefix(char Pattern[]) {
    int x = 0;
    for (int i = 2; i <= n; i++) {
        while (x > 0 && Pattern[x + 1] != Pattern[i]) x = Pi[x];
        if (Pattern[x + 1] == Pattern[i]) x++;
        Pi[i] = x;
    }
}

void KMP(char Pattern[], char String[]) {
    int x = 0;
    for (int i = 1; i <= m; i++) {
        while (x > 0 && Pattern[x + 1] != String[i]) x = Pi[x];
        if (Pattern[x + 1] == String[i]) x++;
        if (x == n) {
            Ans[++nr] = i - n;
            x = Pi[x];
        }
    }
    fout << nr << "\n";
    int lg = min(nr, 1000);
    for (int i = 1; i <= lg; i++) {
        fout << Ans[i] << " ";
    }
    fout << "\n";
}

int main () {
    ios_base :: sync_with_stdio (false);
    fin >> (A + 1) >> (B + 1);
    n = strlen(A + 1);
    m = strlen(B + 1);
    Prefix(A);
    KMP(A, B);
    fin.close();
    fout.close();
    return 0;
}