博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【洛谷 P5357】 【模板】AC自动机(二次加强版)(AC自动机,差分)
阅读量:6457 次
发布时间:2019-06-23

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

每次匹配都不停跳fail显然太慢了,于是在每个节点和fail指向的点连一条边,构成一棵树,在这棵树上差分一下就好了。

AC自动机 就这个算法而言其实没用想象中那么难。

#include 
#include
#include
using namespace std;struct Node{ int fail, next[26], num;}AC[200010];int n, u, cnt;queue
q;int p[200010], vis[200010];char a[2000010];int f[200010];struct Edge{ int next, to;}e[200010];int head[200010], num;inline void Add(int from, int to){ e[++num].to = to; e[num].next = head[from]; head[from] = num;}void insert(int x){ int len = strlen(a + 1), w; u = 0; for(int i = 1; i <= len; ++i){ w = a[i] - 'a'; if(!AC[u].next[w]) AC[u].next[w] = ++cnt; u = AC[u].next[w]; } f[x] = u;}void BuildFail(){ u = 0; for(int i = 0; i < 26; ++i) if(AC[u].next[i]) q.push(AC[u].next[i]); while(q.size()){ u = q.front(); q.pop(); for(int i = 0; i < 26; ++i) if(AC[u].next[i]){ q.push(AC[u].next[i]); AC[AC[u].next[i]].fail = AC[AC[u].fail].next[i]; } else AC[u].next[i] = AC[AC[u].fail].next[i]; }}void Match(){ int len = strlen(a + 1); u = 0; for(int i = 1; i <= len; ++i){ u = AC[u].next[a[i] - 'a']; ++vis[u]; }}void dfs(int x){ for(int i = head[x]; i; i = e[i].next){ dfs(e[i].to); vis[x] += vis[e[i].to]; }}int main(){ scanf("%d", &n); for(int i = 1; i <= n; ++i) f[i] = i; for(int i = 1; i <= n; ++i){ scanf("%s", a + 1); insert(i); } scanf("%s", a + 1); BuildFail(); Match(); for(int i = 1; i <= cnt; ++i) Add(AC[i].fail, i); dfs(0); for(int i = 1; i <= n; ++i) printf("%d\n", vis[f[i]]); return 0;}

转载于:https://www.cnblogs.com/Qihoo360/p/10883618.html

你可能感兴趣的文章
Linux Shell简介
查看>>
Neo4j安装&入门&一些优缺点(转)
查看>>
python基础初识介绍以及安装
查看>>
cocos2d-x调度器原理
查看>>
spring boot缓存excel临时文件后再操作
查看>>
已经上架的app在AppStore上搜不到的解决办法
查看>>
Hadoop日志以及日志的格式和命名组成
查看>>
Bootstrap3基础 栅格系统 col-lg/md/sm/xs-* 简单示例
查看>>
jsp+servlet+javaBean实现用户留言
查看>>
CSS盒模型
查看>>
解决网站使用sqlite时并发问题的一个经验
查看>>
operamasks—omBorderLayout布局
查看>>
代理模式
查看>>
彻底搞定C指针---指向指针的指针(转)
查看>>
Django多进程日志文件问题
查看>>
easyUI combobox combotree 模糊查询,带上下键选择功能,待完善。。。。
查看>>
RHEL6解决无法使用YUM源问题
查看>>
百度地址解析和逆地址解析
查看>>
【Dig工具】
查看>>
Jobs
查看>>