Cod sursa(job #420762)

Utilizator cristiprgPrigoana Cristian cristiprg Data 20 martie 2010 15:08:48
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>
#include <cstring>
#define DIM 2000005
char A[DIM], B[DIM];
int b[DIM], sol[1024], nrsol, n, m;

void kmpPreprocess()
{

    b[0] = -1;
    for (int i = 0, j = -1; i < m; ++i, ++j, b[i] = j)
        while(j > -1 && A[i] != A[j])
            j = b[j];

}

void kmpSearch()
{

    for (int i = 0, q = -1; i < m; ++i)
    {
        while (q > -1 && A[q+1] != B[i])
            q = b[q];
        if (A[q+1] = B[i])
            ++q;
        if (q == n)
        {

            ++nrsol;
            sol[nrsol] = i-n+1;
        }

    }

}

int main()
{
    FILE *f = fopen("strmatch.in", "r");
    fscanf(f,"%s%s", A, B);
    fclose(f);
    n = strlen(B);
    m = strlen(A);
    kmpPreprocess();
    kmpSearch();

    f = fopen("strmatch.out", "w");
    fprintf(f, "%d\n", nrsol);
    nrsol=(nrsol>1000)?1000:nrsol;
    for (int i = 1; i <= nrsol; ++i)
        fprintf(f, "%d ", sol[i]);
    fclose(f);
    return 0;
}