Pagini recente » Cod sursa (job #278199) | Cod sursa (job #879055) | Cod sursa (job #140078) | Cod sursa (job #857111) | Cod sursa (job #723973)
Cod sursa(job #723973)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
#define dim 1000005
#define maxn 10005
int n,nr, pi[maxn],lung,sol;
char v[dim], b[maxn];
void read()
{
char c;
while((c=fin.get()) && (c!='\n'))
v[++nr]=c;
v[0]=' ';
fin>>n;
c=fin.get();
}
void make_prefix()
{
int i, q=0;
for(i=2;i<=lung;++i)
{
while(q!=0 && b[q+1]!=b[i])
q=pi[q];
if(b[q+1]==b[i])
++q;
pi[i]=q;
}
}
void init()
{
memset(pi,0,sizeof(pi));
char c;
lung=sol=0;
while((c=fin.get()) && (c!='\n') && (c!=EOF))
b[++lung]=c;
b[0]=' ';
}
void solve()
{
for(int i=1;i<=n;++i)
{
init();
make_prefix();
int q=0;
for(int j=1;j<=nr;++j)
{
while(q!=0 && b[q+1]!=v[j])
q=pi[q];
if(b[q+1]==v[j])
++q;
if(q==lung)
{
++sol;
q=pi[lung];
}
}
fout<<sol<<'\n';
}
}
int main()
{
read();
solve();
return 0;
}