hdu 3065
来源:互联网 发布:mysql.tar.gz 编辑:程序博客网 时间:2024/04/29 04:28
#include<stdio.h>#include<string.h>int cnt[1005];char str[1005][100],s[2000005];struct node{ node *fail; node *next[33]; int id; node() { id=0; fail=NULL; memset(next,0,sizeof(next)); }}*q[50005];node *root;void insert(char *str,int id){ int i; node *p=root; for(i=0; str[i]!='\0'; i++) { int len=str[i]-'A'; if(p->next[len]==NULL) p->next[len]=new node(); p=p->next[len]; } p->id=id;}void build_ac_automation(){ int head=0,tail=0,i; q[head++]=root; root->fail=NULL; while(head!=tail) { node *temp=q[tail++]; node *p=NULL; for(i=0; i<32; i++) { if(temp->next[i]!=0) { 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(char *str){ int i=0,n; node *p=root; while(str[i]) { if(str[i]>='A'&&str[i]<='Z') { n=str[i]-'A'; while(p->next[n]==NULL&&p!=root) p=p->fail; p=p->next[n]; p=(p==NULL)?root:p; node *temp=p; while(temp!=root&&temp->id>0) { cnt[temp->id]++; temp=temp->fail; } } else p=root; i++; }}int main(){ int i,n; while(scanf("%d",&n)!=EOF) { root=new node(); for(i=1; i<=n; i++) { scanf("%s",str[i]); insert(str[i],i); } build_ac_automation(); memset(cnt,0,sizeof(cnt)); scanf("%s",s); query(s); for(i=1; i<=n; i++) if(cnt[i]!=0) printf("%s: %d\n",str[i],cnt[i]); }}
0 0
- HDU 2896 &HDU 3065
- HDU 3065
- hdu 3065
- hdu 3065
- hdu 3065
- hdu 3065
- (3065)HDU
- hdu 3065
- hdu 3065
- hdu 2222 hdu 3065 hdu 2896 AC自动机水题
- AC自动机小结 (HDU 2222,HDU 2896,HDU 3065)
- AC自动机(hdu 2896 hdu 3065)
- hdu 3065(AC自动机)
- HDU 3065 AC自动机
- hdu 3065 AC自动机
- HDU 3065(ac自动机)
- HDU 3065 AC自动机
- HDU 3065 AC自动机
- 关于 OOP、C和C++
- cookie的相关知识
- 5个Xcode开发调试技巧(转自CocoaChina)
- hdu 2896
- [Android] TextView实现走马灯效果
- hdu 3065
- Android开发获取唯一设备ID
- [Android] TextView的垂直滚动效果
- dinic模板 邻接矩阵
- 黑马程序员-----匿名内部类(黑马视频)
- 字符设备与块设备的区别
- HttpClient 实现跳转请求
- 庭审管理中动态显示今天起7日内的数据,动态查询,并根据已有数据判断新增和修改时的时间冲突问题
- NGUI-基础用法