标签:
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; struct node { node* next[26]; int end; node* fail; node() { for(int i = 0;i<26;i++) next[i] = NULL; fail = NULL; end = 0; } }; node* root; char s[51],ss[1100000]; void insert() { int i,l = strlen(s); node* k = root; for(i = 0;i<l;i++) { int id = s[i]-‘a‘; if(k->next[id] == NULL) k->next[id] = new node(); k = k->next[id]; } k->end++; } void build() { queue<node*> q; for(int i = 0;i<26;i++) { node* k = root; if(k->next[i] != NULL) { k->next[i]->fail = root; q.push(k->next[i]); } } while(!q.empty()) { node*k = q.front(); q.pop(); for(int i = 0;i<26;i++) { if(k->next[i]!=NULL) { node*t = k->fail; while(t!=root&&t->next[i] == NULL) t = t->fail; if(t->next[i] != NULL) t = t->next[i]; k->next[i]->fail = t; q.push(k->next[i]); } } } } int ask() { int i,l = strlen(ss),ans = 0; node *k = root; for(i = 0;i<l;i++) { int id = ss[i]-‘a‘; while(k!=root&&k->next[id] == NULL) k = k->fail; if(k->next[id]!=NULL) k = k->next[id]; node* t = k; while(t!=root) { ans += t->end; t->end = 0; t = t->fail; } } return ans; } int main() { int z; int n,i,j,k; cin>>z; while(z--) { root = new node(); scanf("%d",&n); while(n--) { scanf("%s",s); insert(); } build(); scanf("%s",ss); printf("%d\n",ask()); } return 0; }
标签:
原文地址:http://www.cnblogs.com/wos1239/p/4398942.html