SDOI 2016 生成魔咒 题解
题目传送门
题目大意: 给出一个字符串,询问它的每一个前缀内包含多少个不同的子串。
题解
将字符一个一个加入到SAM里,每个新的字符的的贡献为 l e n ( x ) − l e n ( l i n k ( x ) ) len(x)-len(link(x)) len(x)−len(link(x)),因为从 l e n ( l i n k ( x ) ) len(link(x)) len(link(x)) 这个长度开始,下面的长度的后缀都已经出现过了,只有上面的后缀是没出现过的,即新的不同的子串。
代码如下:
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
#define maxn 200010int n;
long long ans=0;
struct state{int len,link;map<int,int> next;
}st[maxn];
int id=0,last=0,now,p,q;
void extend(int x)
{now=++id;st[now].len=st[last].len+1;for(p=last;p!=-1&&!st[p].next.count(x);p=st[p].link)st[p].next[x]=now;if(p!=-1){q=st[p].next[x];if(st[p].len+1==st[q].len)st[now].link=q;else{int clone=++id;st[clone]=st[q];st[clone].len=st[p].len+1;for(;p!=-1&&st[p].next[x]==q;p=st[p].link)st[p].next[x]=clone;st[q].link=st[now].link=clone;}}last=now;
}int main()
{scanf("%d",&n);st[0].link=-1;for(int i=1,x;i<=n;i++){scanf("%d",&x);extend(x);ans+=st[now].len-st[st[now].link].len;printf("%lld\n",ans);}
}
SDOI 2016 生成魔咒 题解相关推荐
- BZOJ4516: [Sdoi2016]生成魔咒
BZOJ4516: [Sdoi2016]生成魔咒 Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示. 例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒 ...
- P4070 [SDOI2016]生成魔咒
P4070 [SDOI2016]生成魔咒 题意: 有n个字符xi,每次在S的末尾加入一个字符,(一开始S为空),每次加入xi后的不相同字串有多少个 题解: 做这个题首先要会后缀数组P3809 [模板] ...
- 【刷题】BZOJ 4516 [Sdoi2016]生成魔咒
Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例 ...
- [SDOI2016]生成魔咒
4516: [Sdoi2016]生成魔咒 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1460 Solved: 835 [Submit][Sta ...
- BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
4516: [Sdoi2016]生成魔咒 题意:询问一个字符串每个前缀有多少不同的子串 做了一下SDOI2016R1D2,题好水啊随便AK 强行开map上SAM 每个状态的贡献就是\(Max(s)-M ...
- [SDOI2016] 生成魔咒(后缀数组SA + st表 + set)动态不同子串个数
problem luogu-P4070 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1,21,21,2 拼凑起来形成一个魔咒串 [1,2][1,2][1,2]. 一个魔咒串 ...
- 【ACWing】2572. 生成魔咒
题目地址: https://www.acwing.com/problem/content/2574/ 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 , 2 1, 2 1,2 ...
- 【SDOI2016】生成魔咒
Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例 ...
- 洛谷 P4070 [SDOI2016]生成魔咒 解题报告
P4070 [SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 \(1\).\(2\) 拼凑起来形成一个魔咒串 \([1,2]\). 一个魔咒 ...
最新文章
- NodeJS基础2---2 Promise详解
- ubuntu部署java环境
- NDK,动态链接库,JNI
- Linux系统中为php添加pcntl扩展的方法
- Linux 免密登录和配置环境变量
- db2 兼容 oracle 语法,db2 case when和oracle兼容有关问题
- 洛谷 1373 dp 小a和uim之大逃离 良心题解
- python海龟图画龙珠_DeepOps的Python小笔记-天池龙珠计划-Python训练营-Task 02:DAY5
- 【sklearn第二十二讲】协方差估计
- C# XmlReader
- base64减少图片请求
- 爬虫常用的user_agent
- CAD快捷键命令------画矩形
- littleVGL开发(8):消息弹窗控件(lv_mbox)
- 超低功耗摄像头 门锁 猫眼
- 拼多多 标题 html,【拼多多如何变成新用户】拼多多老用户变新用户教程_拼多多砍价网...
- 如何快速给食物照片调色
- 镜像 网站 linux 程序,腾讯开源镜像网站(腾讯云软件源)地址,附使用说明
- 分布式锁-Redis解决方案和Redisson解决方案
- 高精度加法 高精度减法 高度除法 高精度乘法 方法总结