Pagini recente » Cod sursa (job #2115170) | Cod sursa (job #1131867) | Cod sursa (job #1301169) | Cod sursa (job #1366753) | Cod sursa (job #723974)
Cod sursa(job #723974)
#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()
{
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];
}
}
memset(pi,0,lung+1);
fout<<sol<<'\n';
}
}
int main()
{
read();
solve();
return 0;
}