[后缀自动机 DP] LOJ#6071. 「2017 山东一轮集训 Day5」字符串
来源:互联网 发布:电脑电话软件 编辑:程序博客网 时间:2024/05/19 23:53
那么DP的转移可以用后缀自动机转移
#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=4000010,P=1e9+7;int n,cnt=1,len;int nxt[N][30],fail[N],f[30],stp[N],t[N],r[N],g[N],p=1;char a[N];inline void extend(int x){ int np=++cnt; stp[np]=stp[p]+1; while(p && !nxt[p][x]) nxt[p][x]=np,p=fail[p]; if(!p) fail[np]=1; else{ int q=nxt[p][x]; if(stp[q]==stp[p]+1) fail[np]=q; else{ int nq=++cnt; stp[nq]=stp[p]+1; memcpy(nxt[nq],nxt[q],sizeof(nxt[nq])); fail[nq]=fail[q]; fail[q]=fail[np]=nq; while(p && nxt[p][x]==q) nxt[p][x]=nq,p=fail[p]; } } p=np;}int main(){ scanf("%d",&n); while(n--){ scanf("%s",a+1); len=strlen(a+1); for(int i=len;i;i--) extend(a[i]-'a'); for(int i=0;i<=cnt;i++) t[i]=0; for(int i=1;i<=cnt;i++) t[stp[i]]++; for(int i=1;i<=cnt;i++) t[i]+=t[i-1]; for(int i=1;i<=cnt;i++) r[t[stp[i]]--]=i; for(int i=cnt;i;i--){ int x=r[i]; g[x]=1; for(int j=0;j<26;j++) if(nxt[x][j]) (g[x]+=g[nxt[x][j]])%=P; else (g[x]+=f[j])%=P; } for(int i=0;i<26;i++) if(nxt[1][i]) f[i]=g[nxt[1][i]]; for(int i=1;i<=cnt;i++){ stp[i]=fail[i]=0; for(int j=0;j<26;j++) nxt[i][j]=0; } cnt=p=1; } int ans=0; for(int i=0;i<26;i++) (ans+=f[i])%=P; printf("%d\n",ans+1);}
阅读全文
0 0
- [后缀自动机 DP] LOJ#6071. 「2017 山东一轮集训 Day5」字符串
- [分块 回文自动机] LOJ#6070. 「2017 山东一轮集训 Day4」基因
- [倍增NTT][DP] LOJ#6059. 「2017 山东一轮集训 Day1」Sum
- [莫队维护DP] LOJ#6074. 「2017 山东一轮集训 Day6」子序列
- [容斥 DP] LOJ#6077. 「2017 山东一轮集训 Day7」逆序对
- LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
- LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
- [霍尔定理]「2017 山东一轮集训 Day2」LOJ 6062——PAIR
- [动态网络 网络流] LOJ#6068.「2017 山东一轮集训 Day4」棋盘
- [最短路 杂题] LOJ#6075. 「2017 山东一轮集训 Day6」重建
- [费用流]LOJ#6079. 「2017 山东一轮集训 Day7」养猫
- loj #6062. 「2017 山东一轮集训 Day2」Pair(线段树)
- [DP][倍增NTT]LOJ#6059. 2017 山东一轮集训 Day1. Sum
- [LOJ#6060][线性基]2017 山东一轮集训 Day1. Set
- [线段树][二分图 霍尔定理]LOJ#6062 && 2017 山东一轮集训 Day2. Pair
- [计数][容斥] LOJ#6065 || BZOJ4927 && 2017 山东一轮集训 Day3. 第一题
- [树的同构][二分][可并堆维护哈希] LOJ#6066 || BZOJ4928 && 2017 山东一轮集训 Day3. 第二题
- LOJ 6100 「2017 山东二轮集训 Day1」第一题
- 微信公众平台编辑器教程-微信公众号使用教程32
- 记得坚持曾经的梦想
- 泛型 _Get_deleter_pointer_type
- 短信通知限制
- WINFORM.FormBorderStyle
- [后缀自动机 DP] LOJ#6071. 「2017 山东一轮集训 Day5」字符串
- Linux下Tomcat重新启动
- 微博深度学习平台架构和实践
- 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
- bzoj 5057: 区间k小值5
- 2018年人工智能将赋能所有行业,未来市场将超过400亿美元
- DeepMind最新论文提出「Rainbow」,将深度强化学习组合改进
- 一张通往计算机世界的地图
- 神经元轴突发育的探索简史