Pagini recente » Cod sursa (job #1670148) | Cod sursa (job #220654) | Cod sursa (job #3338980) | Cod sursa (job #218303) | Cod sursa (job #3320984)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("ahocorasick.in");
ofstream cout("ahocorasick.out");
string s2;
int subs[1000005];
int fre[1000005];
int nxt[1000005][30];
int nodes=0;
int nod[1005];
int cnt[1000005];
int addtri(int curr,int poz,int dim)
{
if(poz==dim)
{
subs[curr]++;
return curr;
}
int cr=s2[poz]-'a';
if(nxt[curr][cr]==0)
{
nodes++;
nxt[curr][cr]=nodes;
}
return addtri(nxt[curr][cr],poz+1,dim);
}
queue<int>qu;
int main()
{
int n,i;
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s;
cin>>s;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s2;
nod[i]=addtri(0,0,s2.size());
}
qu.push(0);
vector<int>order;
while(qu.size())
{
int curr=qu.front();
fre[curr]=1;
order.push_back(curr);
qu.pop();
for(int i=0;i<26;i++)
{
if(nxt[curr][i]==0)
{
nxt[curr][i]=nxt[nxt[curr][26]][i];
}
}
for(int i=0;i<26;i++)
{
if(fre[nxt[curr][i]]==0)
{
if(curr!=0)
{
nxt[nxt[curr][i]][26]=nxt[nxt[curr][26]][i];
}
fre[nxt[curr][i]]=1;
qu.push(nxt[curr][i]);
}
}
}
int curr=0;
for(int i=0;i<s.size();i++)
{
curr=nxt[curr][(int)s[i]-'a'];
cnt[curr]++;
}
while(order.size()>1)
{
cnt[nxt[order.back()][26]]+=cnt[order.back()];
order.pop_back();
}
for(i=1;i<=n;i++)
{
cout<<cnt[nod[i]]<<'\n';
}
return 0;
}