hdu 2222 Keywords Search

AC自动机的模板题,需要注意的是有可能出现重复的模式

 

另外,当找到一个模式后,讲它标记为已找到,就不重复去找了

 

代码:

#include #include #include #include #include #include #include #include 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;inext[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(headnext[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;inext[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<

你可能感兴趣的:(字符串)