Keywords Search
来源:互联网 发布:mac联网后无法上网 编辑:程序博客网 时间:2024/05/22 02:06
典型的AC自动机题目,模板题但是初次学的AC自动机,错了n多次。
题目大意:给出n个字符串,然后再给出一个主串,求这个n个字符串中有几个字符串是是主串的子串?
连接:Keywords Search
代码:
#include <stdio.h>#include <string.h>#include <iostream>using namespace std;#define N 1000005char word[N];int head,tail;struct node{ node *fail; int cnt; node *next[26]; node() { memset(next,0,sizeof(next)); fail=NULL; cnt=0; }}*que[5000005];node *root;void Insert(char msg[]){ int i=0; node*ptr=root; int k; while(msg[i]) { k=msg[i]-'a'; if(ptr->next[k]==NULL) ptr->next[k]=new node(); ptr=ptr->next[k]; i++; } ptr->cnt++;}void build_ac(){ que[tail++]=root; while(tail!=head) { node *cur=que[head++]; node*ptr=NULL; for(int i=0;i<26;i++) { if(cur->next[i]!=NULL) { if(cur==root)cur->next[i]->fail=root; else { ptr=cur->fail; while(ptr!=NULL) { if(ptr->next[i]!=NULL) { cur->next[i]->fail=ptr->next[i]; break; } ptr=ptr->fail; } if(ptr==NULL) cur->next[i]->fail=root; } que[tail++]=cur->next[i]; } } }}int search_word(char msg[]){ int i=0; node*ptr=root; int k; int ans=0; while(msg[i]) { k=msg[i]-'a'; while(ptr->next[k]==NULL && ptr!=root)ptr=ptr->fail; ptr=ptr->next[k]; if(ptr==NULL)ptr=root; node *tmp=ptr; while(tmp!=NULL && tmp->cnt!=-1) { ans+=tmp->cnt; tmp->cnt=-1; tmp=tmp->fail; } i++; } return ans;}void del(node*head){ for(int i=0;i<26;i++) if(head->next[i]!=NULL) del(head->next[i]); delete head;}int main(){ char msg[55]; int T,n; scanf("%d",&T); while(T--) { root=new node(); head=tail=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",msg); Insert(msg); } build_ac(); scanf("%s",word); printf("%d\n",search_word(word)); del(root); } return 0;}
0 0
- Keywords Search
- Keywords Search
- Keywords Search
- Keywords Search
- Keywords Search
- Keywords Search
- Keywords Search
- Keywords Search
- Keywords Search
- Keywords Search
- HDU2222 Keywords Search
- hdu 2222 Keywords Search
- hdu 2222 Keywords Search
- hdu2222 Keywords Search
- HDU-2222 Keywords Search
- 自动机 Keywords Search 2222
- hdu 2222 Keywords Search
- HDOJ 2222 Keywords Search
- 黑马程序员 银行业务调度系统
- Android Adapter详解
- Poj 2002 Squares (正方形个数 Hash)
- httpd-vhosts.conf
- 软考报名【javascript Validation Framework运行错误】解决方法
- Keywords Search
- 兹孜纵子资座左驻滓琢爪祝宗撞紫驻ysvgsn
- 黑马程序员 封装、继承、多态
- linux内核
- 日期结构体
- CF401-D dp的好题
- 黑马程序员 集合框架
- xiami音乐抓取
- 经典c程序(0005)---用*号输出字母C的图案