洛谷 P4070 [SDOI2016]生成魔咒 解题报告
P4070 [SDOI2016]生成魔咒
题目描述
魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 \(1\)、\(2\) 拼凑起来形成一个魔咒串 \([1,2]\)。
一个魔咒串 \(S\) 的非空字串被称为魔咒串 \(S\) 的生成魔咒。
例如 \(S=[1,2,1]\) 时,它的生成魔咒有 \([1]\)、\([2]\)、\([1,2]\)、\([2,1]\)、\([1,2,1]\) 五种。\(S=[1,1,1]\) 时,它的生成魔咒有 \([1]\)、\([1,1]\)、\([1,1,1]\) 三种。最初 $S $为空串。共进行 \(n\) 次操作,每次操作是在 \(S\) 的结尾加入一个魔咒字符。每次操作后都需要求出,当前的魔咒串 \(S\) 共有多少种生成魔咒。
输入输出格式
输入格式:
第一行一个整数 \(n\)。
第二行 \(n\) 个数,第 \(i\) 个数表示第 \(i\) 次操作加入的魔咒字符。
输出格式:
输出 \(n\) 行,每行一个数。第 \(i\) 行的数表示第 \(i\) 次操作后 \(S\) 的生成魔咒数量
输入输出样例
输入样例#1:
7
1 2 3 3 3 1 2
输出样例#1:
1
3
6
9
12
17
22
说明
对于\(10\%\)的数据,\(1 \le n \le 10\)
对于\(30\%\)的数据,\(1 \le n \le 100\)
对于\(60\%\)的数据,\(1 \le n \le 100\)
对于\(100\%\)的数据,\(1 \le n \le 100000\)
用来表示魔咒字符的数字 \(x\) 满足\(1 \le x \le 10^9\)
SAM用map存边
一个状态的贡献是\(len[x]-len[par[x]]\)
可以发现中间生成的节点不计入贡献
Code:
#include <cstdio>
#include <map>
#define ll long long
const int N=2e5+10;
std::map <int,int> ch[N];
int par[N],len[N],las=1,tot=1,n;
ll ans=0;
void extend(int c)
{int now=++tot,p=las;len[now]=len[p]+1;while(p&&!ch[p][c]) ch[p][c]=now,p=par[p];if(!p) par[now]=1;else{int x=ch[p][c];if(len[x]==len[p]+1) par[now]=x;else{int y=++tot;len[y]=len[p]+1,par[y]=par[x],ch[y]=ch[x];while(p&&ch[p][c]==x) ch[p][c]=y,p=par[p];par[now]=par[x]=y;}}ans=ans+len[now]-len[par[now]];las=now;
}
int main()
{scanf("%d",&n);for(int c,i=1;i<=n;i++){scanf("%d",&c);extend(c);printf("%lld\n",ans);}return 0;
}
2019.1.7
转载于:https://www.cnblogs.com/butterflydew/p/10231753.html
洛谷 P4070 [SDOI2016]生成魔咒 解题报告相关推荐
- 洛谷 P4070 [SDOI2016]生成魔咒 后缀自动机
题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1, ...
- P4070 [SDOI2016]生成魔咒
P4070 [SDOI2016]生成魔咒 题意: 有n个字符xi,每次在S的末尾加入一个字符,(一开始S为空),每次加入xi后的不相同字串有多少个 题解: 做这个题首先要会后缀数组P3809 [模板] ...
- bzoj4516 / P4070 [SDOI2016]生成魔咒
P4070 [SDOI2016]生成魔咒 后缀自动机 每插入一个字符,对答案的贡献为$len[last]-len[fa[last]]$ 插入字符范围过大,所以使用$map$存储. (去掉第35行就是裸 ...
- P4070 [SDOI2016]生成魔咒(SAM len数组的含义)
[SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 , 2 1,2 1,2 拼凑起来形成一个魔咒串 [ 1 , 2 ] [1,2] [1, ...
- luogu P4070 [SDOI2016]生成魔咒
首先有两个结论: 1.后缀自动机具有最简性,即每种不同的子串只会在sam上体现一次,体现形式是sam上一条由root出发的路径. 2.一个字符串不同子串的个数等于所有关键节点的max(x)-min(x ...
- P4070 [SDOI2016]生成魔咒(SAM)
传送门 用后缀数组做的真的心累 后缀数组+ST表+反串思维+set(或平衡树)动态维护 h e i g h t height height数组 然后用 S A M SAM SAM就是模板题- 要求本质 ...
- [SDOI2016]生成魔咒
4516: [Sdoi2016]生成魔咒 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1460 Solved: 835 [Submit][Sta ...
- BZOJ4516: [Sdoi2016]生成魔咒
BZOJ4516: [Sdoi2016]生成魔咒 Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示. 例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒 ...
- BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
4516: [Sdoi2016]生成魔咒 题意:询问一个字符串每个前缀有多少不同的子串 做了一下SDOI2016R1D2,题好水啊随便AK 强行开map上SAM 每个状态的贡献就是\(Max(s)-M ...
最新文章
- 105.通信同步异步定义及其相关
- sqlsever无法重新启动计算机,有关SqlServer 2008安装及卸载的一些问题,安装检测时显示重新启动计算机....
- js操作json数据的一些感受
- Linux服务器运行环境搭建(二)——Redis数据库安装
- p批处理替换目录下文本中的字符串
- celery java_Python的Java Celery项目相当于什么?
- 《C++标准程序库》——STL迭代器
- alreader 2 android,AlReader2
- 课程设计matlab仿真,MATLAB与仿真系统课程设计报告
- 计算机ip怎么换路由器,路由器怎么换ip地址
- c语言中复合语句不用花括号,【单选题】C语言中,可将一系列语句置于( )从而构成复合语句。
A. 一对尖括号\ \之间 B. 一对圆括号\( )\之间 C. 一对花括号 { } 之间 D....
- 输出满足某种条件的素数(C语言)
- 最强nba体验服显示服务器正在停机,最强nba体验服安装包
- Kutools for Excel 结合 300 多种高级功能和工具
- mysql jdbc驱动 批量更新_jdbc批量插入,删除,更新
- php++内购续期订阅,iOS内购:自动续期订阅总结
- 2022:RadiAnt DICOM Viewer-PC+CD[U盘]
- 马哥教育大数据专家:深入解读大数据的就业前景
- 《薛兆丰的经济学课》课程总结3--生命有限
- 详解六种常见的上下文切换场景
热门文章
- Java架构师必会的技能
- 工厂模式详解(简单工厂模式,工厂方法模式,抽象工厂模式,只给出抽象工厂模式具体代码)
- html中嵌套iframe页面
- KOFLive Beta版本发布!
- LeetCode算法题6:贪心 - 跳跃游戏
- SUMO入门(三) - 路网
- 精通javapython拼写_异步图书 精通Python自然语言处理 高清文字版PDF下载
- html语言搭建网站,网络编程(1)——使用HTML搭建一个网页
- Vue.js 源码分析—— Slots 是如何实现的
- 消费者认可度提高,戴比尔斯计划将培育钻石推向“时尚类”领域