【SDOI2016】bzoj4516 生成魔咒【解法一】
来源:互联网 发布:淘宝直通车钱能退吗 编辑:程序博客网 时间:2024/05/29 11:09
每次在SAM中加入一个字符,维护每个点的
因为字符集很大,离散化以后也开不下,可以用map存转移。
#include<cstdio>#include<map>#include<algorithm>using namespace std;#define LL long longconst int maxn=200010;map<int,int> trans[maxn];int fail[maxn],val[maxn],n,tot=1;void check(){ for (int i=1;i<=tot;i++) for (map<int,int>::iterator it=trans[i].begin();it!=trans[i].end();++it) printf("%d-%d->%d\n",i,(*it).first,(*it).second);}int main(){ LL ans=0; int last=1,p,np,q,nq,x; scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&x); p=last; val[last=np=++tot]=val[p]+1; while (p&&!trans[p].count(x)) { trans[p][x]=np; p=fail[p]; } if (!p) fail[np]=1,ans+=val[np]; else { q=trans[p][x]; if (val[q]==val[p]+1) fail[np]=q,ans+=val[np]-val[q]; else { val[nq=++tot]=val[p]+1; fail[nq]=fail[q]; fail[np]=fail[q]=nq; trans[nq]=trans[q]; while (p&&trans[p][x]==q) { trans[p][x]=nq; p=fail[p]; } ans+=val[np]-val[nq]; } } //if (i==5) check(); printf("%lld\n",ans); }}
0 0
- 【SDOI2016】bzoj4516 生成魔咒【解法一】
- 【SDOI2016】bzoj4516 生成魔咒【解法二】
- [bzoj4516][SDOI2016]生成魔咒
- BZOJ4516 [Sdoi2016]生成魔咒
- bzoj4516【SDOI2016】生成魔咒
- bzoj4516: [Sdoi2016]生成魔咒
- bzoj4516: [Sdoi2016]生成魔咒
- BZOJ4516: [Sdoi2016]生成魔咒
- 【bzoj4516】[Sdoi2016]生成魔咒 后缀自动机
- 后缀自动机 【Sdoi2016】生成魔咒 bzoj4516
- [bzoj4516][Sdoi2016]生成魔咒 SAM
- BZOJ4516 [Sdoi2016]生成魔咒 后缀自动机
- Bzoj4516:[Sdoi2016]生成魔咒:哈希表+后缀自动机
- 【BZOJ4516】【Sdoi2016】生成魔咒 后缀数组 线段树
- [BZOJ4516] [SDOI2016] 生成魔咒 - 后缀数组/后缀自动机
- BZOJ4516 [Sdoi2016]生成魔咒 后缀自动机/后缀数组
- BZOJ4516: [Sdoi2016]生成魔咒(后缀数组)
- [BZOJ4516][Sdoi2016]生成魔咒(后缀数组+链表||后缀自动机)
- 如何在新版官网下载spring 开发jar包
- 《深入理解linux内核》笔记八
- Shader编程学习笔记(五)—— Fixed Function Shader 1
- ubuntu系統解决sublime无法输入中文的问题
- java常用算法
- 【SDOI2016】bzoj4516 生成魔咒【解法一】
- 经过一番折磨,我又回来了
- Linq to XML
- 多线程的那点事儿(之数据互斥)
- 《深入理解Linux内核》笔记九
- [数据结构]普里姆(Prim)算法生成最小生成树
-  和 的区别
- Shader编程学习笔记(六)—— Fixed Function Shader 2
- robot framework自动化-------未发现元素重新加载