ac自动机模板(hdu2222)
2015-08-16 10:19
507 查看
#include <iostream> #include<stdio.h> #include<queue> #include<string.h> using namespace std; const int MAX=1e6+20; char str[MAX]; struct node { int count; struct node *next[26]; struct node *fail; void init() { int i; for(i=0;i<26;i++) next[i]=NULL; count=0; fail=NULL; } }*root; void insert() { int len,k; node *p=root; len=strlen(str); for(k=0;k<len;k++) { int pos=str[k]-'a'; if(p->next[pos]==NULL) { p->next[pos]=new node; p->next[pos]->init(); p=p->next[pos]; } else p=p->next[pos]; } p->count++; } void getfail() { int i; node *p=root,*son,*temp; queue<struct node *>que; que.push(p); while(!que.empty()) { temp=que.front(); que.pop(); for(i=0;i<26;i++) { son=temp->next[i]; if(son!=NULL) { if(temp==root) son->fail=root; else { p=temp->fail; while(p) { if(p->next[i]) { son->fail=p->next[i]; break; } p=p->fail; } if(!p) son->fail=root; } que.push(son); } } } } void query() { int len,i,cnt=0; len=strlen(str); node *p,*temp; p=root; for(i=0;i<len;i++) { int pos=str[i]-'a'; while(!p->next[pos]&&p!=root) p=p->fail; p=p->next[pos]; if(!p) p=root; temp=p; while(temp!=root) { if(temp->count>=0) { cnt+=temp->count; temp->count=-1; } else break; temp=temp->fail; } } printf("%d\n",cnt); } int main() { int cas,n; scanf("%d",&cas); while(cas--) { root=new node; root->init(); //root->fail=NULL; scanf("%d",&n); int i; getchar(); for(i=0;i<n;i++) { gets(str); insert(); } getfail(); gets(str); query(); } return 0; }
相关文章推荐
- 新建数据表
- C语言的算术运算
- ECshop前台分类商品列表如何按销量进行排序
- win10 google浏览器设置
- 草率提交任务是不负责任地行为
- 漫展观想
- Hadoop 2.6.0(HA)部署启动
- hdu 5381 The sum of gcd(线段树等差数列区间修改+单点查询)
- request 乱码
- 字典树模板(hdu1251)
- jdbc实现简单的增删改查
- 关于[No grammar constraints (DTD or XML schema) detected for the document.]
- 并查集
- 2015山东毕业生如何进行网上报道(报到证)?
- oracle 学习笔记之触发器
- Swift开发过程中常用到的一些使用技巧和注意的地方
- C#调Exe
- 《软件调试》要点整理
- c++ primer 学习笔记-第十章
- ContentProvider类的设计分析