Pagini recente » Cod sursa (job #748150) | Cod sursa (job #3185338) | Cod sursa (job #2970293) | Cod sursa (job #805577) | Cod sursa (job #1322137)
#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;
}