AC日记——Keywords Search hdu 2222
思路:
ac自动机模板题;
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 500005 struct TreeNodeType { int count; TreeNodeType *fail; TreeNodeType *next[26]; TreeNodeType() { fail=NULL,count=0; for(int i=0;i<26;i++) next[i]=NULL; } }; struct TreeNodeType *root,*que[maxn]; int n; char str[maxn*2],word[100]; inline void in(int &now) { char Cget=getchar();now=0; while(Cget>'9'||Cget<'0') Cget=getchar(); while(Cget>='0'&&Cget<='9') { now=now*10+Cget-'0'; Cget=getchar(); } } void insert(char *ch) { int temp,len=strlen(ch); TreeNodeType *p=root; for(int i=0;i<len;i++) { temp=ch[i]-'a'; if(p->next[temp]==NULL) p->next[temp]=new TreeNodeType; p=p->next[temp]; } p->count++; } void build() { int tail=1,head=0;que[head]=root; while(head<tail) { TreeNodeType *p=que[head++],*temp=NULL; for(int i=0;i<26;i++) { if(p->next[i]==NULL) continue; if(p==root) p->next[i]->fail=root; else { temp=p->fail; while(temp!=NULL) { if(temp->next[i]!=NULL) { p->next[i]->fail=temp->next[i]; break; } temp=temp->fail; } if(temp==NULL) p->next[i]->fail=root; } que[tail++]=p->next[i]; } } } int query() { int pos,len=strlen(str),res=0;TreeNodeType *p=root; for(int i=0;i<len;i++) { pos=str[i]-'a'; while(p->next[pos]==NULL&&p!=root) p=p->fail; if(p->next[pos]!=NULL) p=p->next[pos];else p=root; TreeNodeType *temp=p; while(temp!=root&&temp->count!=-1) res+=temp->count,temp->count=-1,temp=temp->fail; } return res; } int main() { int T; in(T); while(T--) { root=new TreeNodeType; in(n);for(int i=1;i<=n;i++) gets(word),insert(word); build(),scanf("%s",str),printf("%d\n",query()); } return 0; }