博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【无聊放个模板系列】BZOJ 3172 (AC自动机)
阅读量:5174 次
发布时间:2019-06-13

本文共 3153 字,大约阅读时间需要 10 分钟。

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 using namespace std;10 #define Maxn 21011 #define Maxm 100001012 13 struct node14 {15 int son[30],fail,cnt;16 }t[Maxm];int tot;17 18 char s[Maxm];19 int l,bj[Maxn];20 21 void upd(int x)22 {23 memset(t[x].son,0,sizeof(t[x].son));24 t[x].fail=t[x].cnt=0;25 }26 27 void trie(int st)28 {29 int now=0;30 for(int i=1;i<=l;i++)31 {32 int ind=s[i]-'a'+1;33 if(!t[now].son[ind])34 {35 t[now].son[ind]=++tot;upd(tot);36 }37 now=t[now].son[ind];38 t[now].cnt++;39 if(i==l) bj[st]=now;40 }41 }42 43 queue
q;44 stack
sta;45 void build()46 {47 while(!q.empty()) q.pop();48 49 q.push(0);50 while(!q.empty())51 {52 int x=q.front();sta.push(x);53 q.pop();54 for(int i=1;i<=26;i++) if(t[x].son[i])55 {56 if(x&&t[t[x].fail].son[i]) t[t[x].son[i]].fail=t[t[x].fail].son[i];57 q.push(t[x].son[i]);58 }59 else t[x].son[i]=t[t[x].fail].son[i];60 }61 while(!sta.empty())62 {63 int x=sta.top();sta.pop();64 t[t[x].fail].cnt+=t[x].cnt;65 }66 }67 68 int main()69 {70 int n;71 scanf("%d",&n);72 tot=0;upd(0);73 for(int i=1;i<=n;i++)74 {75 scanf("%s",s+1);76 l=strlen(s+1);77 trie(i);78 }79 build();80 for(int i=1;i<=n;i++) printf("%d\n",t[bj[i]].cnt);81 return 0;82 }

 

WA了几次之后终于给面子A了【捂脸= =打模板而已嘛- -

 

多年前手打队列版本

1 #include
2 #include
3 #include
4 5 const int Maxn=(int)1e4; 6 const int Maxl=200; 7 8 struct node 9 {10 int son[27],fail,cnt,ans;11 }t[160357];12 13 int n,m,cnt=0;14 int q[Maxn*Maxl+10],bj[Maxn];15 char s[Maxl];16 17 void floy()18 {19 int i;20 for(i=1;i<=Maxn;i++) t[i].fail=0,t[i].ans=0;21 }22 23 void read() 24 {25 memset(bj,0,sizeof(bj));26 int i,j,x,ind;27 scanf("%d",&n);28 getchar();29 for(i=1;i<=n;i++)30 {31 scanf("%s",s+1);32 m=strlen(s+1);33 x=0;34 for(j=1;j<=m;j++)35 {36 ind=s[j]-'a'+1;37 if(!t[x].son[ind]) t[x].son[ind]=++cnt;38 x=t[x].son[ind];39 t[x].cnt++;40 if(j==m) bj[i]=cnt;41 }42 }43 }44 45 void Build_AC()46 {47 int i,x,y,j;48 q[0]=0;49 q[++q[0]]=0;50 //for(i=1;i<=26;i++) if(t[0].son[i]) q[++q[0]]=t[0].son[i]; 51 for(i=1;i<=q[0];i++)52 {53 x=q[i];54 y=t[x].fail;55 for(j=1;j<=26;j++)56 if(t[x].son[j]) 57 { 58 //t[t[x].son[j]].fail=t[y].son[j];59 t[t[x].son[j]].fail=x?t[y].son[j]:x; 60 q[++q[0]]=t[x].son[j]; 61 }62 else t[x].son[j]=t[y].son[j];63 }64 for(i=q[0];i>=1;i--)65 {66 t[t[q[i]].fail].cnt+=t[q[i]].cnt;67 }68 //for(i=1;i<=cnt;i++) printf("%d %d %d %d\n",i,t[i].cnt,t[i].fail,t[i].ffail);69 }70 71 int main()72 {73 read();74 Build_AC();75 for(int i=1;i<=n;i++) printf("%d\n",t[bj[i]].cnt);76 return 0;77 }

 

 

AC自动机

 

2016-11-18 10:18:14

转载于:https://www.cnblogs.com/Konjakmoyu/p/6076582.html

你可能感兴趣的文章
Arcobject获得栅格影像的边界
查看>>
配置phpmyadmin使登录时可填写IP管理多台MySQL 连接多个数据库 自动登录
查看>>
win7笔记本VirtualBox安装黑苹果MacOS 10.13,win10 VMware虚拟机已升级Mojave 10.14.5
查看>>
python基础-运算符
查看>>
HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射...
查看>>
关闭默认共享,禁止ipc$空连接
查看>>
SmartSql V3 重磅发布
查看>>
uml第四次
查看>>
每天一个 linux命令(35):ln 命令(转载)
查看>>
JavaSE习题 第九章 输入输出流
查看>>
Android 系统属性
查看>>
Java 8 Stream介绍及使用2
查看>>
摘录自《Vivian Lee》
查看>>
4-windows 用cmd 如何输入命令 进入文件夹
查看>>
毕业后的五年拉开大家差距的原因(肖雪)
查看>>
Java集合大全
查看>>
接口限流算法
查看>>
HDU - 2845 Beans
查看>>
html设置背景图片并自适应
查看>>
深入研究C语言 第一篇(续)
查看>>