http://www.shnenglu.com/mythit/archive/2009/07/30/80633.html
http://www.cnblogs.com/destinydesigner/archive/2009/10/15/1584191.html
推薦以上兩個鏈接作為了解AC自動機的材料,加上2006年的一篇Trie圖的論文。
模板+代碼如下:

HDU 2222
#include<iostream>
#include<queue>
using?namespace?std;
struct?Trie
{
????Trie?*next[26];
????Trie?*fail;
????int?cnt;
????Trie()
????{
????????cnt=0;
????????memset(next,NULL,sizeof(next));
????????fail=NULL;
????}
}?*root;
void?build()
{
????root=NULL;
????root=new?Trie;?
}
void?insert(char?*s)
{
????Trie?*r=root,*p;
????int?i=0;
????while(s[i])
????{
????????if(r->next[s[i]-'a']==NULL)
????????{
????????????p=new?Trie();
????????????r->next[s[i]-'a']=p;
????????}
????????r=r->next[s[i]-'a'];
????????i++;
????}
????r->cnt++;
}?
void?BuildTrie()
{
????int?i;
????Trie?*r=root,*p,*tmp;
????root->fail=NULL;
????queue<Trie?*>q;
????q.push(root);
????while(!q.empty())
????{
????????p=q.front();
????????q.pop();
????????for(i=0;i<26;i++)
????????????if(p->next[i]!=NULL)
????????????{
????????????????if(p==root)
????????????????????p->next[i]->fail=root;
????????????????else
????????????????{
????????????????????tmp=p->fail;
????????????????????while(tmp!=root&&tmp->next[i]==NULL)
????????????????????????tmp=tmp->fail;
????????????????????if(tmp->next[i]==NULL)
????????????????????????p->next[i]->fail=root;
????????????????????else?p->next[i]->fail=tmp->next[i];
????????????????}
????????????????q.push(p->next[i]);
????????????}
????}
}
int?check(char?*s)
{
????int?c=0;
????Trie?*r=root,*p,*tmp;
????while(*s)
????{
????????int?idx=*s-'a';
????????while(r->next[idx]==NULL&&r!=root)
????????????r=r->fail;
????????r=r->next[idx];
????????if(r==NULL)
????????????r=root;
????????tmp=r;
????????while(tmp!=root)
????????{
????????????c+=tmp->cnt;
????????????tmp->cnt=0;
????????????tmp=tmp->fail;
????????}
????????s++;
????}
????return?c;
}
int?cas,n;
char?txt[1000010],ss[52];
int?main()
{
????scanf("%d",&cas);
????while(cas--)
????{
????????scanf("%d",&n);
????????build();
????????while(n--)
????????{
????????????scanf("%s",ss);
????????????insert(ss);
????????}
????????scanf("%s",txt);
????????BuildTrie();
????????printf("%d\n",check(txt));
????}
????return?0;
}
http://www.cnblogs.com/destinydesigner/archive/2009/10/15/1584191.html
推薦以上兩個鏈接作為了解AC自動機的材料,加上2006年的一篇Trie圖的論文。
模板+代碼如下:
#include<iostream>
#include<queue>
using?namespace?std;
struct?Trie
{
????Trie?*next[26];
????Trie?*fail;
????int?cnt;
????Trie()
????{
????????cnt=0;
????????memset(next,NULL,sizeof(next));
????????fail=NULL;
????}
}?*root;
void?build()
{
????root=NULL;
????root=new?Trie;?
}
void?insert(char?*s)
{
????Trie?*r=root,*p;
????int?i=0;
????while(s[i])
????{
????????if(r->next[s[i]-'a']==NULL)
????????{
????????????p=new?Trie();
????????????r->next[s[i]-'a']=p;
????????}
????????r=r->next[s[i]-'a'];
????????i++;
????}
????r->cnt++;
}?
void?BuildTrie()
{
????int?i;
????Trie?*r=root,*p,*tmp;
????root->fail=NULL;
????queue<Trie?*>q;
????q.push(root);
????while(!q.empty())
????{
????????p=q.front();
????????q.pop();
????????for(i=0;i<26;i++)
????????????if(p->next[i]!=NULL)
????????????{
????????????????if(p==root)
????????????????????p->next[i]->fail=root;
????????????????else
????????????????{
????????????????????tmp=p->fail;
????????????????????while(tmp!=root&&tmp->next[i]==NULL)
????????????????????????tmp=tmp->fail;
????????????????????if(tmp->next[i]==NULL)
????????????????????????p->next[i]->fail=root;
????????????????????else?p->next[i]->fail=tmp->next[i];
????????????????}
????????????????q.push(p->next[i]);
????????????}
????}
}
int?check(char?*s)
{
????int?c=0;
????Trie?*r=root,*p,*tmp;
????while(*s)
????{
????????int?idx=*s-'a';
????????while(r->next[idx]==NULL&&r!=root)
????????????r=r->fail;
????????r=r->next[idx];
????????if(r==NULL)
????????????r=root;
????????tmp=r;
????????while(tmp!=root)
????????{
????????????c+=tmp->cnt;
????????????tmp->cnt=0;
????????????tmp=tmp->fail;
????????}
????????s++;
????}
????return?c;
}
int?cas,n;
char?txt[1000010],ss[52];
int?main()
{
????scanf("%d",&cas);
????while(cas--)
????{
????????scanf("%d",&n);
????????build();
????????while(n--)
????????{
????????????scanf("%s",ss);
????????????insert(ss);
????????}
????????scanf("%s",txt);
????????BuildTrie();
????????printf("%d\n",check(txt));
????}
????return?0;
}

