【模板】AC自动机

ACM模板


目录

      • 插入以及构建AC自动机
      • 【模板】AC自动机(二次加强版)
      • ac自动机fail树上dfs序建可持久化线段树

插入以及构建AC自动机

#include<queue>
#include<string>
const int N=200010;
struct node
{int chd[26],fail,cnt;
}tree[N];
void insert(string s)
{int p=0;for(int i=0;i<s.size();i++){int c=s[i]-'a';if(!tree[p].chd[c]) tree[p].chd[c]=++cnt;p=tree[p].chd[c];}
}
void build()
{queue<int> q;for(int i=0;i<26;i++)if(tree[0].chd[i]) q.push(tree[0].chd[i]);while(q.size()){int t=q.front();q.pop();for(int i=0;i<26;i++){int &chd=tree[t].chd[i];if(chd)tree[chd].fail=tree[tree[t].fail].chd[i],q.push(chd);else// 如果没有儿子 那么将fail的儿子作为儿子chd=tree[tree[t].fail].chd[i];}}
}

【模板】AC自动机(二次加强版)

给你一个文本串 SSSnnn 个模式串 T1..nT_{1..n}T1..n,请你分别求出每个模式串 TiT_iTiSSS 中出现的次数。

#include<queue>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
const int N=200010;
struct node
{int chd[26],fail,cnt;
}tree[N];
int cnt;
int h[N],e[N],ne[N],idx;
int pos[N];
void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int insert(string s)
{int p=0;for(int i=0;i<s.size();i++){int c=s[i]-'a';if(!tree[p].chd[c]) tree[p].chd[c]=++cnt;p=tree[p].chd[c];}return p;
}
void build()
{queue<int> q;for(int i=0;i<26;i++){int c=tree[0].chd[i];if(!c) continue;tree[c].fail=0;add(0,c);q.push(c);}while(q.size()){int t=q.front();q.pop();for(int i=0;i<26;i++){int &chd=tree[t].chd[i];if(chd){tree[chd].fail=tree[tree[t].fail].chd[i];add(tree[chd].fail,chd);// 构建失配树 fail指针向自己连边q.push(chd);}elsechd=tree[tree[t].fail].chd[i];}}
}
void dfs(int u)
{for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];dfs(j);tree[u].cnt+=tree[j].cnt;}
}
int main()
{ios::sync_with_stdio(0);memset(h,-1,sizeof h);int n;cin>>n;string s;for(int i=1;i<=n;i++){cin>>s;pos[i]=insert(s);}build();cin>>s;for(int i=0,j=0;i<s.size();i++){j=tree[j].chd[s[i]-'a'];tree[j].cnt++;}dfs(0);for(int i=1;i<=n;i++) cout<<tree[pos[i]].cnt<<'\n';return 0;
}

ac自动机fail树上dfs序建可持久化线段树

待更新
upd:2020/2/2
子串能够表示为前缀的后缀,在Trie树中经过的节点是前缀,fail树上是后缀

#include<queue>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
constexpr int N=200010;
struct node1
{int chd[26],fail,fa;int id;
}tree[N];int idx1;
int h[N],e[N],ne[N],idx2;
int n,m,pos[N];
void add(int a,int b){e[idx2]=b,ne[idx2]=h[a],h[a]=idx2++;}
void insert(string &s,int id)
{int p=0;for(int i=0;i<s.size();i++){int &chd=tree[p].chd[s[i]-'a'];if(!chd) {chd=++idx1;tree[chd].fa=p;}p=chd;}tree[p].id=id;pos[id]=p;
}
void build()
{queue<int> q;for(int i=0;i<26;i++){int chd=tree[0].chd[i];if(!chd) continue;q.push(chd);}while(q.size()){int t=q.front();q.pop();add(tree[t].fail,t);   //建fail树for(int i=0;i<26;i++){int &chd=tree[t].chd[i];if(chd)tree[chd].fail=tree[tree[t].fail].chd[i],q.push(chd);elsechd=tree[tree[t].fail].chd[i];}}
}
struct node2
{int l,r;int val;
}T[40*N];
int root[N],cnt;
void update(int l,int r,int pre,int &now,int pos,int val)
{now=++cnt;T[now]=T[pre];T[now].val+=val;if(l==r) return;int mid=l+r>>1;if(pos<=mid) update(l,mid,T[pre].l,T[now].l,pos,val);elseupdate(mid+1,r,T[pre].r,T[now].r,pos,val);
}
int query(int u,int l,int r,int L,int R)
{if(!u) return 0;if(L<=l&&r<=R) return T[u].val;int mid=l+r>>1;int v=0;if(L<=mid) v+=query(T[u].l,l,mid,L,R);if(R>mid) v+=query(T[u].r,mid+1,r,L,R);return v;
}
int dfn[N],sz[N],timestamp;
void dfs(int u)
{dfn[u]=++timestamp;sz[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];dfs(j);sz[u]+=sz[j];}
}
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n>>m;memset(h,-1,sizeof h);for(int i=1;i<=n;i++){string s;cin>>s;insert(s,i);}build();dfs(0);// dfs序for(int i=1;i<=n;i++) {update(1,timestamp,root[i-1],root[i],dfn[pos[i]],1);int p=tree[pos[i]].fa;while(p){update(1,timestamp,root[i],root[i],dfn[p],1);p=tree[p].fa;}}while(m--){int l,r,k;cin>>l>>r>>k;cout<<query(root[r],1,timestamp,dfn[pos[k]],dfn[pos[k]]+sz[pos[k]]-1)-query(root[l-1],1,timestamp,dfn[pos[k]],dfn[pos[k]]+sz[pos[k]]-1)<<'\n';}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡

本系列相关文章&#xff1a;《ASP.NET Core中Ocelot的使用&#xff1a;API网关的应用》《ASP.NET Core中Ocelot的使用&#xff1a;基于Spring Clound Netflix Eureka的动态路由》本文将基于前两篇文章所述内容&#xff0c;继续介绍如何在服务发现和动态路由的基础上&#xff0c…

CF643F-Bears and Juice【组合数学】

正题 题目链接:https://www.luogu.com.cn/problem/CF643F 题目大意 题目有点奇怪就直接放翻译了 有 nnn 只熊和若干桶果汁和恰好一桶酒&#xff0c;每一天每只熊会选择一些桶&#xff08;可能不选&#xff09;并各喝一 杯&#xff0c;喝到酒的熊会去睡觉并不再回来&#xff…

【模板】Manacher算法

ACM模板 目录初始化以及构造初始化以及构造 数组下标从1开始即cin>>s1 由于奇回文串和偶回文串某些性质不同&#xff0c;我们首先通过init()操作使得新串中所有回文串的长度都变成奇数&#xff0c;返回值是新串的长度&#xff08;原串中的下标i对应新串中的2i&#xff09…

POJ2155 - Matrix(二维树状数组)

POJ2155 - Matrix 文章目录题目题解&#xff1a;代码题目 给你一个二维矩阵&#xff0c;初始化为0&#xff0c;然后可以进行两次操作&#xff1a; C:x,y,x1,y2 对该小矩阵内的数进行取反 Q:查询某个点是0还是1 题解&#xff1a; C是区间修改&#xff0c;Q是单点查询&#xf…

牛客挑战赛48C-铬合金之声【Prufer序列】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/C 题目大意 nnn个点加mmm条边使得不存在环&#xff0c;每种方案的权值是所有联通块的大小乘积。 求所有方案的权值和。 1≤n≤109,1≤m≤1071\leq n\leq 10^9,1\leq m\leq 10^71≤n≤109,1≤m≤107 解题思路 就是分…

F - Sugoroku2(期望dp)

F - Sugoroku2 期望dp&#xff1a;fuf_ufu​表示到达终点的期望于是有 fu{0,u≥nf0,u∈Afu1⋯fumm1f_u\begin{cases} 0,u\ge n \\f_0,u\in A\\ \frac{f_{u1}\dotsf_{um}}{m}1 \end{cases}fu​⎩⎪⎨⎪⎧​0,u≥nf0​,u∈Amfu1​⋯fum​​1​ 由于存在返回f0f_0f0​的操作&…

.NET Core2使用Azure云上的Iot-Hub服务

基于工业4.0大背景下的工业物联网是近几年内热门的话题&#xff0c;依靠信息化技术企业可以实现数字化转型&#xff0c;生产可以实现智能化制造&#xff0c;设备可以实现自动化运作。然而&#xff0c;海量的数据采集是整个建设过程的基础环节&#xff0c;如何处理与利用这海量的…

Matrix Subtraction(小米icpc邀请赛第一场)

Matrix Subtraction 题意&#xff1a; 一个给定的矩阵&#xff0c;然后给定一个子矩阵的大小&#xff0c;子矩阵可以 将覆盖矩阵的区域的值减1&#xff0c;问能否将矩阵全部减为0 题解&#xff1a; 思路和下面这个链接讲的题十分相似 传送 本质就是二维树状数组差分求解 用…

E - Rotate and Flip(线性代数矩阵坐标变换)

E - Rotate and Flip 顺时针 [010−100001][xy1][y−x1]\begin{bmatrix} 0 & 1 & 0\\ -1&0&0\\0 &0&1 \end{bmatrix}\begin{bmatrix} x\\y\\1 \end{bmatrix}\begin{bmatrix} y\\-x\\1 \end{bmatrix}⎣⎡​0−10​100​001​⎦⎤​⎣⎡​xy1​⎦⎤​⎣…

CF755G-PolandBall and Many Other Balls【倍增FFT】

正题 题目链接:https://www.luogu.com.cn/problem/CF755G 题目大意 nnn个东西排成一排&#xff0c;每个组可以选择一个单独的物品或者两个连续的物品&#xff0c;一个物品不同同时在两个组里&#xff0c;但是可以不在组里。对于i∈[1,k]i\in[1,k]i∈[1,k]求分成iii组的方案数。…

Intelligent Warehouse(小米邀请赛)

题目 题意&#xff1a; n个数字&#xff0c;问存在的最长的一组数&#xff0c;使得其中任意两个数的都是倍数关系&#xff0c;问最长的长度是多少 题解&#xff1a; 暴力。。。 没想到暴力就能做&#xff0c;当时就该交上去试试的 用dp[i]表示当期选的所有数都是i的约数且符…

SmartCode.ETL 这不是先有鸡还是蛋的问题!

继国庆节 SmartCode 正式版&#xff08;SmartCode.Generator&#xff09;发布之后&#xff0c;SmartCode 迎来了新的能力 SmartCode.ETL !SmartCode 正式版从开始发布就从未说过自己仅仅是个代码生成器&#xff0c;这点上从我第一次宣布SmartCode正式开源的文章就可以说明&…

codeforces1469 E. A Bit Similar

E. A Bit Similar 代码抄的这份题解 找到一个长度为k的串使得在s长度为k的子串中&#xff0c;对于所有子串答案串都至少有一位相同。也就是如果将s长度为k的子串全部按位取反&#xff0c;那么答案串不能与这些反串匹配。 现在问题转化成&#xff0c;找到一个答案串&#xff…

对拍

参考博客 晚上不想刷题。。无聊的开始研究对拍 以前oi的时候看过对拍&#xff0c;奈何当时水平太差根本用不上对拍&#xff0c;&#xff08;现在水平也不咋地。。&#xff09; 上面那个博文讲的非常好。。 对拍最终的就是 对拍程序.bat 首先第一步&#xff1a;生成一组输入数据…

P7444-「EZEC-7」猜排列【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7444 题目大意 一个长度为nnn的排列&#xff0c;已知每个cic_ici​表示那个排列中mexmexmex为iii的区间个数。求满足条件的排列个数 1≤n≤5105,ci≥0,∑i1ncin(n1)2−11\leq n\leq 5\times 10^5,c_i\geq 0,\sum_{i1}^nc_i\…

dubbo线程池为什么耗尽

文章概述 大家可能都遇到过DUBBO线程池打满这个问题&#xff0c;报错如下&#xff0c;本文我们就一起分析DUBBO线程池打满这个问题。 cause: org.apache.dubbo.remoting.RemotingException: Server side(10.0.0.100,20881) thread pool is exhausted, detail msg:Thread pool …

手把手教你写DI_0_DI是什么?

DI是什么&#xff1f;Dependency Injection 常常简称为&#xff1a;DI。它是实现控制反转&#xff08;Inversion of Control – IoC&#xff09;的一个模式。fowler 大大大神 “几十年”前的经典文章 https://www.martinfowler.com/articles/injection.html 说的很清楚。“几十…

C++顺序创建txt文件

今天下午在对拍数据的时候感觉好麻烦。。 一次次手调文件名称&#xff0c;突然想起可以直接写段程序集中操作 顺序输出 #include <iostream> #include <fstream> #include<string> using namespace std;int main () {ofstream File;for(int i0;i<3;i){str…

【模板】字符串哈希

ACM模板 目录构建应用构建 字符串哈希就是将字符串映射成一个数&#xff0c;哈希冲突是不可避免的&#xff0c;我们需要选用合适的base尽可能使得哈希冲突可能性降低 unsigned long long溢出后相当于取模&#xff0c;相当于模264−12^{64}-1264−1 get(l,r)函数返回字符串下标…

P5137-polynomial【倍增】

正题 题目链接:https://www.luogu.com.cn/problem/P5137 题目大意 TTT组数据给出n,a,b,pn,a,b,pn,a,b,p求 (∑01naibn−i)%p\left(\sum_{01}^na^ib^{n-i}\right)\%p(01∑n​aibn−i)%p 1≤T≤105,1≤n,a,b,p≤10181\leq T\leq 10^5,1\leq n,a,b,p\leq 10^{18}1≤T≤105,1≤n,a…