LA 4670
来源:互联网 发布:软件培训班价格 编辑:程序博客网 时间:2024/04/28 14:29
题目:http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=329
在hust 上不知道为什么交UVAlive的题目全是错的。。我在安徽大学上提交通过,但在hust上uvalive的题目都交不过。
AC自动机。这题很好啊,找了很久的错误都才找到,关键要注意两个方面,一个是模版串可能有重复的,在输出的时候需要全部输出,二是在查询的时候
while(temp!=root&&temp->cnt>=0){ // //这里要设置成大于等于,因为进入这里可能只是个中间串,但是在跳转的时候可能跳到模版串的末尾。 for(int j=0;j<(temp->id.size());j++) ans[ temp->id[j] ]++; temp=temp->fail; }
#include<cstdio>#include<cstring>#include<map>#include<string>#include<vector>using namespace std;char s[200][100];char str[1100000];int ans[200];int head,tail;struct node{ node *fail; node *next[26]; int cnt; vector<int > id; node() { cnt=0; id.clear(); fail=NULL; memset(next,NULL,sizeof(next)); }} *q[5000000];void insert(node *root,char str[],int id){ int i=0,index; node *p=root; while(str[i]){ index=str[i]-'a'; if(p->next[index]==NULL) p->next[index]= new node(); p=p->next[index]; i++; } p->cnt++; p->id.push_back(id);}void build_ac(node *root){ root->fail=NULL; q[head++]=root; while(head!=tail){ node *temp=q[tail++]; node *p=NULL; for(int 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[head++]=temp->next[i]; } } }}void query(node *root){ int i=0,index; node *p=root; int len=strlen(str); for(int i=0;i<len;i++){ 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&&temp->cnt>=0){ for(int j=0;j<(temp->id.size());j++) ans[ temp->id[j] ]++; temp=temp->fail; } }}int main(){ int n; while(scanf("%d",&n)!=EOF){ if(n==0) break; memset(ans,0,sizeof(ans)); head=tail=0; node *root = new node(); for(int i=0;i<n;i++) scanf("%s",s[i]),insert(root,s[i],i+1); build_ac(root); scanf("%s",str); query(root); int max=0; for(int i=1;i<=n;i++) if(ans[i]>max) max=ans[i]; printf("%d\n",max); for(int i=1;i<=n;i++){ if(ans[i]==max){ printf("%s\n",s[i-1]); } } } return 0;}
- LA 4670
- LA 4670 Dominating Patterns
- LA 4670 Dominating Patterns
- LA 4670 Dominating Patterns
- LA 4670 Dominating Patterns
- la la la, la la la
- LA 4670 ac自动机模板
- UVA LA 4670(AC自动机)
- UVa LA 4670 Dominating Patterns
- LA 4670 AC自动机简单题
- LA 4670 Dominating Patterns (AC自动机)
- LA - 4670 - Dominating Patterns(AC自动机)
- LA 4670 dominating patterns AC自动机
- LA 4670 Dominating Patterns,AC自动机
- LA 4670 Dominating Patterns (ac自动机)
- UVALive 4670 (LA 4670) Dominating Patterns AC自动机
- LA 4670 Dominating Patterns AC自动机简单题
- LA 4670 Dominating Patterns——AC自动机
- (源码)android应用案例之三(spinner实现级联菜单)
- 一步步搭建Ubuntu环境——Ubuntu 12.04LTS 版本txt乱码解决方案
- 将数据“写入、输出”到文件中(C++文件操作初体验)
- POJ 1258 Agri-Net
- Android ApiDemos示例解析(4):App->Activity->Custom Dialog
- LA 4670
- Oracle EBS各个版本使用情况的调查
- Java中文分词器Ansj
- 在myeclipse中快速新建JavaBean
- C#学习之六---光标定位
- 各种数据库的JDBC驱动下载及连接字符串URL写法
- linux虚拟机下挂载iso
- 乘积的末三位
- Servic 'VisualSVN Server' failed to start.Please check VisualSVN Server log in Event Viewer for more