Pagini recente » Cod sursa (job #1445536) | Cod sursa (job #1320699) | Cod sursa (job #2024780) | Cod sursa (job #1927780) | Cod sursa (job #1535307)
#include<fstream>
#include<iostream>
#include <cstdio>
#include <string>
#include <vector>
#define pb push_back
using namespace std;
int N, r1[1000100],r[1000100];
int Q[1000100],st,dr;
vector<int> sol,g[1000100];
struct Trie {
int ind;
Trie *q[26], *f;
Trie(int x) {
ind = x;
for(int i=0;i<26;++i) q[i] = 0;
}
};
vector<Trie*> v;
void ins(Trie *nod, string &s, int poz) {
if(poz == s.size()) {
sol.pb(nod->ind); return;
}
int c = s[poz] - 'a';
if(nod->q[c]==0) {
Trie *nt = new Trie(v.size());
v.pb(nt); nod->q[c] = nt;
}
ins(nod->q[c],s,poz+1);
}
void make_fail() {
for(int i=0;i<26;++i) {
if(v[0]->q[i] == 0) continue;
Trie *y = v[0]->q[i];
Q[dr++] = y->ind;
y->f = v[0];
g[0].pb(y->ind);
}
while(st < dr) {
int x = Q[st++];
for(int i=0;i<26;++i) {
if(v[x]->q[i] == 0) continue;
Trie *y = v[x]->q[i];
Trie *curr = v[x]->f;
while(curr != 0 && curr->q[i] == 0) curr = curr->f;
if(curr == 0) y->f = v[0];
else y->f = curr->q[i];
g[y->f->ind].pb(y->ind);
Q[dr++] = y->ind;
}
}
}
void dfs(int x) {
r[x] = r1[x];
for(auto y: g[x]) {
dfs(y); r[x] += r[y];
}
}
void do_magic(string &s) {
int L = s.size();
Trie *curr = v[0];
for(int i=0;i<L;++i) {
int c = s[i]-'a';
while(curr != 0 && curr->q[c] == 0) {
curr = curr->f;
}
if(curr == 0) {
curr = v[0];
} else {
++r1[curr->q[c]->ind];
curr = curr->q[c];
}
}
dfs(0);
}
void make_aho() {
string a,b;
cin>>a>>N;
Trie *T = new Trie(0);
v.pb(T);
for(int i=1;i<=N;++i) {
cin>>b;
ins(T,b,0);
}
make_fail();
do_magic(a);
for(auto x: sol) {
cout<<r[x]<<"\n";
}
}
int main() {
std::ios_base::sync_with_stdio (false);
freopen("ahocorasick.in","r",stdin);
freopen("ahocorasick.out","w",stdout);
make_aho();
return 0;
}