hdu 3065 病毒侵袭持续中(AC automaton)
来源:互联网 发布:淘宝阿玛尼气垫假货 编辑:程序博客网 时间:2024/06/05 07:32
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3065
每个子串是不同的,求出在源码串中各个子串出现的次数,按照输入子串的顺序将出现次数大于0的输出。
例如:
Sample Input
3AABBCCooxxCC%dAAAoen....END
Sample Output
AA: 2CC: 1HintHit:题目描述中没有被提及的所有情况都应该进行考虑。比如两个病毒特征码可能有相互包含或者有重叠的特征码段。计数策略也可一定程度上从Sample中推测。
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;int head,tail;const int nn=60; //122-65=57int N;char str[2000010],keyword[55]; char s[1000][55];struct node{ int sum,id; node *next[nn],*fail; bool operator <(const node other)const { return id>other.id; } node(){ //inital node fail=NULL; id=sum=0; memset(next,0,sizeof(next)); //here }}*q[55*1000];node *root;void insert_t(char str[],int dex){ int temp,len; node *p=root; len=strlen(str); for(int i=0;i<len;i++){ temp=str[i]-65; if(p->next[temp]==NULL)p->next[temp]=new node(); p=p->next[temp]; } p->id=dex; strcpy(s[dex],str); p->sum++;}void build_ac(){ //inital fail point q[tail++]=root; while(head<tail){ node *p=q[head++],*temp=NULL; for(int i=0;i<nn;i++){ if(p->next[i]!=NULL){ if(p==root)p->next[i]->fail=root; else { temp=p->fail; while(temp){ if(temp->next[i]){ p->next[i]->fail=temp->next[i]; break; } temp=temp->fail; } if(!temp)p->next[i]->fail=root; } q[tail++]=p->next[i]; } } }}priority_queue<node> que;void query(){ int i,dex,len=strlen(str); node *p=root; for(i=0;i<len;i++){ dex=str[i]-65; if(dex<0||dex>57){ p=root; continue; } while(p->next[dex]==NULL&&p!=root)p=p->fail; p=p->next[dex]; if(!p)p=root; node *temp=p; while(temp!=root&&temp->sum!=0){ que.push(*temp); temp=temp->fail; } }}int main(){ int t; while(cin>>N){ head=tail=0; root=new node(); int i,j,total=0; for(i=0;i<N;i++){ scanf("%s",keyword); insert_t(keyword,i+1); } build_ac(); scanf("%s",str); query(); while(!que.empty()){ node temp1=que.top(); que.pop(); if(!que.empty()){ node temp2=que.top(); //que.pop(); while(temp1.id==temp2.id){ temp2.sum+=temp1.sum; //处理sum temp1=temp2; que.pop(); if(!que.empty()){ temp2=que.top(); } else break; } } printf("%s: %d\n",s[temp1.id],temp1.sum); } } return 0;}
0 0
- hdu 3065 病毒侵袭持续中(AC automaton)
- Hdu 3065 病毒侵袭持续中//Aho-Corasick Automaton
- HDU 病毒侵袭持续中(AC自动机)
- AC自动机 病毒侵袭持续中 HDU
- 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 自动机再来。。 病毒持续侵袭中
- HDU 3065 病毒侵袭持续中(AC自动机)
- hdu 3065 病毒侵袭持续中(AC自动机)
- poj1064 Cable master(hdoj1551)
- 对C标准中空白字符的理解(转)
- 黑马程序员-----OC学习之类与对象
- 字符编码格式的显示与存储示例分析
- Material Design
- hdu 3065 病毒侵袭持续中(AC automaton)
- java中的构造器
- 每天一个小知识点18(Angularjs总结六)
- 行为金融学理论与股市关系,以及被恶意做空的私募圈
- hdu5336 十滴水游戏的模拟
- JSTL中<fmt:bundle >找不到properties文件的原因
- 一个简单的联动菜单和定时器
- hdu 4280 Island Transport(最大流)
- 控制台下的计算器——C++实现