Pagini recente » Cod sursa (job #2466228) | Cod sursa (job #501801) | Cod sursa (job #1948622) | Cod sursa (job #924034) | Cod sursa (job #968149)
Cod sursa(job #968149)
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <bitset>
#include <queue>
#include <deque>
#include <list>
#include <set>
#include <ctime>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
ifstream ff("ahocorasick.in");
ofstream gg("ahocorasick.out");
#define max 100001
struct tri{ struct tri* uu[26], *e; vector<int> ll; int r;
tri(){ memset(uu, 0, sizeof(uu)); e=0; ll.clear(); r=0; } }*t;
int n, aa[102];
vector<tri*> qq;
string ss, pp;
void add(const string& pp, int k){
int l=pp.length(), c;
tri* g=t;
for(int i=0;i<l;i++){
c=pp[i]-'a';
if(g->uu[c]==0)g->uu[c]=new tri;
g=g->uu[c];
}
g->ll.push_back(k);
}
void bfs(){
tri *l,*g;
int p=0;
t->e=t;
qq.push_back(t);
while(p<(int)qq.size()){
g=qq[p++];
for(int i=0;i<26;i++)
if(g->uu[i]!=0){
for(l=g->e;l!=t && l->uu[i]==0;l=l->e);
if(l->uu[i]!=0 && l->uu[i] != g->uu[i])l=l->uu[i];
g->uu[i]->e=l;
qq.push_back(g->uu[i]);
}
}
t->e=0;
}
void aho(const string &ss){
int l=ss.length(), c;
tri *g=t;
for(int i=0;i<l;i++){
c=ss[i]-'a';
while(g!=t && g->uu[c]==0)g=g->e;
if(g->uu[c]!=0)g=g->uu[c];
g->r++;
}
}
void sol(){
int p=qq.size()-1;
tri *g;
while(p>=0){
g=qq[p--];
if(g->e!=0) g->e->r += g->r;
for(int i=0;i<(int)g->ll.size();i++) aa[g->ll[i]]=g->r;
}
}
int main(){
t=new tri;
ff >> ss;
ff >> n;
for(int i=1;i<=n;i++){
ff >> pp;
add(pp, i);
}
bfs();
aho(ss);
sol();
for(int i=1;i<=n;i++) gg << aa[i] << "\n";
}