Cod sursa(job #2020894)

Utilizator Horia14Horia Banciu Horia14 Data 11 septembrie 2017 23:21:55
Problema Aho-Corasick Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<cstdio>
#include<cstring>
#define LENGTH_TEXT 1000000
#define LENGTH_PATTERN 10000
using namespace std;

char T[LENGTH_TEXT+1], P[LENGTH_PATTERN+1];
int pi[LENGTH_PATTERN+1], len, m;

int main()
{
    int n, i, k, j, nr;
    FILE *fin, *fout;
    fin = fopen("ahocorasick.in","r");
    fout = fopen("ahocorasick.out","w");
    fscanf(fin,"%s\n",T);
    fscanf(fin,"%d",&n);
    m = strlen(T);
    for(j=1; j<=n; j++)
    {
        fscanf(fin,"%s\n",P);
        len = strlen(P);
        k = 0;
        nr = 0;
        for(i=1; i<len; i++)
        {
            while(k > 0 && P[i] != P[k])
                k = pi[k-1];
            if(P[i] == P[k])
                k++;
            pi[i] = k;
        }
        k = 0;
        for(i=0; i<m; i++)
        {
            while(k > 0 && T[i] != P[k])
                k = pi[k-1];
            if(T[i] == P[k])
                k++;
            if(k == len)
                nr++;
        }
        fprintf(fout,"%d\n",nr);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}