AC自动机模板
2015-12-23 20:58
218 查看
贴一个HDU2222 ac自动机模板题。
1A,没什么错误。
1A,没什么错误。
[code]#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; char s[1000010]; struct ACautomata{ int next[500010][26],fail[500010],cnt[500010],last[500010],num,root; int newnode() { memset(next[num],0,sizeof next[num]); cnt[num]=0; return num++; } void init() { num=0; root=newnode(); } void insert(char *s) { int len=strlen(s),cur=root; for(int i=0;i<len;++i) { int &tmp=next[cur][s[i]-'a']; if(!tmp)tmp=newnode(); cur=tmp; } ++cnt[cur]; } void getfail() { queue<int>q; fail[root]=root; for(int i=0;i<26;++i) { int u=next[root][i]; if(u) { fail[u]=last[u]=0; q.push(u); } } while(!q.empty()) { int cur=q.front(); q.pop(); for(int i=0;i<26;++i) { int u=next[cur][i]; if(!u)next[cur][i]=next[fail[cur]][i]; else { fail[u]=next[fail[cur]][i]; last[u]=cnt[fail[u]]?fail[u]:last[fail[u]]; q.push(u); } } } } int query(char *s) { int len=strlen(s),cur=root,ret=0; for(int i=0;i<len;++i) { cur=next[cur][s[i]-'a']; int tmp=cur; while(tmp!=root) { ret+=cnt[tmp]; cnt[tmp]=0; tmp=last[tmp]; if(cnt[tmp]==0)break;//这里注意有的题目不能break } } return ret; } }ac; int cas,n; int main() { scanf("%d",&cas); while(cas--) { ac.init(); scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%s",s); ac.insert(s); } ac.getfail(); scanf("%s",s); printf("%d\n",ac.query(s)); } }
相关文章推荐
- alibaba-LVS版本发布
- margin:0 auto在IE中失效的解决方案
- html5中拨打电话代码
- JS小知识点----基本包装类型和引用类型
- .NET/C# 各版本变化及衍生知识点 C# 1.0/2.0
- 基础知识《九》---网络编程
- Linux内核启动过程分析
- Mysql 实现 三目运算判断
- Android Framework 概述笔记
- linux设备驱动
- VS2012及VS2013连接SQL2008提示 Could not load file or assembly 'Microsoft.SqlServer.Management.Sdk.Sfc'
- Ajax初步实现页面局部内容更替
- 程序包管理之yum的用法
- kvo浅析与实例
- 安装软件包
- MFC 进度条
- 有趣的回文素数
- 学习笔记:《jQuery基础教程》第四版第六章课后练习——通过Ajax发送数据
- datatables配置及数据传输
- pymongo连接mongoDb