Cod sursa(job #1322137)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 19 ianuarie 2015 19:54:18
Problema Aho-Corasick Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb

#include <cstdio>
#include <algorithm>
#include <fstream>
#include <cstring>
using namespace std;
#define nmax 2000005
ifstream f("ahocorasick.in");
ofstream g("ahocorasick.out");
int m,n,nr;
char a[nmax],b[nmax];
int pi[nmax];

void make_prefix()
{
    int i;
    for (i=1;i<=m;i++) pi[i]=0;
    int k=0;
    pi[1]=0;
    for (i=2;i<=m;++i)
    {
        while (k&&a[k+1]!= a[i])
            k=pi[k];
        if (a[k+1] == a[i])
            ++k;
        pi[i]=k;
    }
}
void resolve()
{
    int i,q=0;
    f.getline(a,10005);
    m=strlen(a);
    for (i=m;i;--i) a[i] = a[i-1]; a[0] = ' ';
    make_prefix();
    nr=0;
    for (i=1;i<=n;++i)
    {
        while (q&&a[q+1]!=b[i])
                 q=pi[q];
        if (a[q+1]==b[i])
            ++q;
        if (q == m)
        {
            q = pi[m];
            ++nr;
        }
    }

    g<<nr<<'\n';

}
int main()
{
    int i;
    f.getline(b,nmax);
    n=strlen(b);
    for (i=n;i;--i) b[i] = b[i-1]; b[0] = ' ';
    f>>i;f.get();
    while (i) {resolve();
             i--;}




    return 0;
}