AC自动机的模板题,需要注意的是有可能出现重复的模式 另外,当找到一个模式后,讲它标记为已找到,就不重复去找了 代码: #include<iostream> #include<memory.h> #include<string> #include<cstdio> #include<algorithm> #include<math.h> #include<stack> #include<queue> using namespace std; struct node { int cnt; node *next[26],*fail; }trie[2000005],*que[2000005]; int index; char t[1000005]; char s; node * newnode() { memset(trie+index,0,sizeof(trie[0])); return &trie[index++]; } void insert(char str[],node *root) { int i=0,del,len=strlen(str); node *p=root; for(i=0;i<len;i++) { del=str[i]-'a'; if(p->next[del]==NULL) { p->next[del]=newnode(); } p=p->next[del]; } p->cnt++; } void build_fail(node *root) { int head=0,tail=0,i; que[++tail]=root; root->fail=NULL; while(head<tail) { node *fa=que[++head]; for(i=0;i<26;i++) { if(fa->next[i]) { if(fa==root) { fa->next[i]->fail=root; } else { node *pre=fa->fail; while(pre!=NULL) { if(pre->next[i]!=NULL) { fa->next[i]->fail=pre->next[i]; break; } pre=pre->fail; } if(pre==NULL) fa->next[i]->fail=root; } que[++tail]=fa->next[i]; } } } } int query(node *root) { int i,del,ans=0; int len=strlen(t); node *cur=root; for(i=0;i<len;i++) { del=t[i]-'a'; while(cur!=root&&cur->next[del]==NULL) { cur=cur->fail; } cur=cur->next[del]; if(cur==NULL) cur=root; node *tmp=cur; while(tmp!=root&&tmp->cnt!=-1) { ans+=tmp->cnt; tmp->cnt=-1; tmp=tmp->fail; } //i++; } return ans; } int main() { int i,j,n,T; scanf("%d",&T); char s[55]; node *root; while(T--) { index=0; root=newnode(); scanf("%d",&n); gets(s); //cout<<s<<endl; while(n--) { gets(s); insert(s,root); } build_fail(root); scanf("%s",&t); printf("%d/n",query(root)); } return 0; }