HDU 3065 病毒侵袭持续中 AC自动机
2011-10-01 21:01
453 查看
/* 很裸的AC自动机, 关键是如何去掉模式串中的不相干字符 */ #include<cstdio> #include<cstring> #include <iostream> #include<algorithm> #include<queue> #include<set> using namespace std; const int kind = 26; int ans[1009]; struct node{ node *fail; //失败指针 node *next[kind]; //Tire每个节点的26个子节点(最多26个字母) int count,id; //是否为该单词的最后一个节点 node(){ //构造函数初始化 fail=NULL; count=0; memset(next,NULL,sizeof(next)); } }; //队列,方便用于bfs构造失败指针 char keyword[1009][51]; //输入的单词 char str[2000009]; //模式串 int head,tail; //队列的头尾指针 void insert(char *str,node *root,int id){ node *p=root; int i=0,index; while(str[i]){ index=str[i]-'A'; if(p->next[index]==NULL) p->next[index]=new node(); p=p->next[index]; i++; } p->count++; p->id=id; } void build_ac_automation(node *root){ int i; root->fail=NULL; queue<node *> q; q.push(root); while(!q.empty()){ node *temp=q.front();q.pop(); node *p=NULL; for(i=0;i<26;i++){ if(temp->next[i]!=NULL){ if(temp==root) temp->next[i]->fail=root; else{ p=temp->fail; while(p!=NULL){ if(p->next[i]!=NULL){ temp->next[i]->fail=p->next[i]; break; } p=p->fail; } if(p==NULL) temp->next[i]->fail=root; } q.push(temp->next[i]); } } } }int n,m; int query(node *root){ int i=0,cnt=0,index,len=strlen(str); node *p=root; while(str[i]) { // 去掉不相干字符 if(str[i]<'A'||str[i]>'Z') { p=root; i++; continue; } //**************** index=str[i]-'A'; while(p->next[index]==NULL && p!=root) p=p->fail; p=p->next[index]; p=(p==NULL)?root:p; node *temp=p; while(temp!=root){ cnt+=temp->count; if(temp->id>0&&temp->id<=n) ans[temp->id]++; temp=temp->fail; } i++; } return cnt; } int main(){ char c; while(scanf("%d",&n)!=EOF) { memset(ans,0,sizeof(ans)); node *root=new node(); for(int i=1;i<=n;i++) { scanf("%s",keyword[i]); insert(keyword[i],root,i); } build_ac_automation(root); scanf("%s",str); query(root); for(int i=1;i<=n;i++) { if(ans[i]>0) { printf("%s: %d\n",keyword[i],ans[i]); } } } return 0; }
相关文章推荐
- hdu 3065 病毒侵袭持续中 (AC自动机)
- hdu 3065 病毒侵袭持续中 (ac 自动机)
- HDU 3065 病毒侵袭持续中 (AC自动机)
- HDU 3065 - 病毒侵袭持续中 (AC自动机)
- HDU 3065 病毒侵袭持续中 | AC自动机
- hdu 3065 病毒侵袭持续中 (ac自动机)
- AC自动机专题——C - 病毒侵袭持续中 HDU - 3065
- hdu 3065 病毒侵袭持续中 - AC自动机
- HDU 3065 病毒侵袭持续中 (AC自动机)
- HDU 3065 病毒侵袭持续中 (AC自动机)
- HDU 3065 病毒侵袭持续中 (AC自动机)
- HDU 3065 病毒侵袭持续中 (AC自动机)
- HDU 3065 病毒侵袭持续中 (AC自动机)
- 病毒侵袭持续中 (HDU_3065) AC自动机
- HDU 3065 病毒侵袭持续中 (AC自动机)
- HDU 3065 病毒侵袭持续中 (AC自动机)
- hdu 3065 病毒侵袭持续中 AC自动机
- HDU-3065-病毒侵袭持续中-AC自动机
- hdu 3065 病毒侵袭持续中 (AC)
- AC日记——病毒侵袭持续中 hdu 3065