hdu 3065 病毒侵袭持续中 AC自动机模版题
2013-01-07 16:55
453 查看
做法:基本的AC自动机,因为每次循环验证的位置不同(后缀位置),所以,每次fail过后都是新的字串,可以放进dudu
#include <iostream> #include <cstdio> #include <cstring> #include <deque> #define CNUM 30 #define LMT 2000005 using namespace std; struct node { node *chl[CNUM]; node *fail; int aim; node():aim(0),fail(0) { memset(chl,0,sizeof(chl)); } }; char sec[LMT]; node *root; deque<node *>q; int dudu[1002]; void insert(char src[],int sign) { int len=strlen(src),index; node *current=root; for(int i=0;i<len;i++) { index=src[i]-'A'; if(current->chl[index])current=current->chl[index]; else { current->chl[index]=new node; current=current->chl[index]; } } current->aim=sign; } void build_ac(void) { node *current,*tem; q.clear(); q.push_back(root); while(!q.empty()) { current=*q.begin(); q.pop_front(); for(int i=0;i<CNUM;i++) if(current->chl[i]) { if(current==root)current->chl[i]->fail=root; else { tem=current->fail; while(tem) { if(tem->chl[i]) { current->chl[i]->fail=tem->chl[i]; break; } tem=tem->fail; } if(!tem)current->chl[i]->fail=root; } q.push_back(current->chl[i]); } } } bool equry(void) { int index,ret=0,len=strlen(sec); node *current=root,*tem; memset(dudu,0,sizeof(dudu)); for(int i=0;i<len;i++) { if(sec[i]>='A'&&sec[i]<='Z') index=sec[i]-'A'; else index=27; while(current&¤t->chl[index]==NULL) current=current->fail; if(!current)current=root; else current=current->chl[index]; tem=current; while(tem!=root) { dudu[tem->aim]++; tem=tem->fail; } } return ret; } void kill(node *x) { for(int i=0;i<CNUM;i++) if(x->chl[i])kill(x->chl[i]); delete x; } int main() { int n; char str[1002][55]; while(~scanf("%d",&n)) { root=new node; for(int i=1;i<=n;i++) { scanf("%s",str[i]); insert(str[i],i); } build_ac(); scanf("%s",sec); equry(); for(int i=1;i<=n;i++) if(dudu[i]) printf("%s: %d\n",str[i],dudu[i]); kill(root); } return 0; }
相关文章推荐
- AC自动机 病毒侵袭持续中 HDU - 3065
- [hdu 3065] 病毒侵袭持续中 [AC自动机] [病毒特征码匹配]
- hdu 3065 病毒侵袭持续中 ac自动机模板题
- [HDU 3065]病毒侵袭持续中[AC自动机][模板题]
- hdu 3065 病毒侵袭持续中 ac自动机
- AC自动机 病毒侵袭持续中 HDU - 3065
- 病毒侵袭持续中 - HDU 3065(AC自动机,判断子串个数)
- HDU 3065 病毒侵袭持续中【AC自动机】
- HDU 3065 病毒侵袭持续中 AC自动机
- HDU 3065 病毒侵袭持续中 AC自动机
- HDU 3065 病毒侵袭持续中 ac自动机 统计文本串的单词和其出现的次数。
- HDU 3065 病毒侵袭持续中 ac自动机
- 【AC自动机】 HDU 3065 病毒侵袭持续中
- HDU-3065 病毒侵袭持续中 AC自动机
- HDU 3065 病毒侵袭持续中 AC自动机
- HDU 3065 病毒侵袭持续中 AC自动机题解
- AC自动机 病毒侵袭持续中 HDU - 3065
- HDU 3065 病毒侵袭持续中 AC自动机
- 【HDU】3065 病毒侵袭持续中 AC自动机
- hdu-3065 病毒侵袭持续中 --------AC自动机