洛谷 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
洛谷 P4070 [SDOI2016]生成魔咒 解题报告的更多相关文章
- [洛谷P4070][SDOI2016]生成魔咒
题目大意:有一个字符串,每次在末尾加入一个字符,问当前共有多少个本质不同的字串 题解:$SAM$,就是问插入这个字符后,多了多少个字串,就是当前这个点的$Right$数组大小. 卡点:无 C++ Co ...
- P4070 [SDOI2016]生成魔咒
题目地址:P4070 [SDOI2016]生成魔咒 相信看到题目之后很多人跟我的思路是一样的-- 肯定要用 SA(P3809 [模板]后缀排序) 肯定要会求本质不同的子串个数(P2408 不同子串个数 ...
- bzoj4516 / P4070 [SDOI2016]生成魔咒
P4070 [SDOI2016]生成魔咒 后缀自动机 每插入一个字符,对答案的贡献为$len[last]-len[fa[last]]$ 插入字符范围过大,所以使用$map$存储. (去掉第35行就是裸 ...
- Luogu P4070 [SDOI2016]生成魔咒
题目链接 \(Click\) \(Here\) 其实是看后缀数组资料看到这个题目的,但是一眼反应显然后缀自动机,每次维护添加节点后的答案贡献即可,唯一不友好的一点是需要平衡树维护,这里因为复杂度不卡而 ...
- 【LG4070】[SDOI2016]生成魔咒
[LG4070][SDOI2016]生成魔咒 题面 洛谷 题解 如果我们不用在线输的话,那么答案就是对于所有状态\(i\) \[ \sum (i.len-i.fa.len) \] 现在我们需要在线询问 ...
- BZOJ4516: [Sdoi2016]生成魔咒 后缀自动机
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #inclu ...
- BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
4516: [Sdoi2016]生成魔咒 题意:询问一个字符串每个前缀有多少不同的子串 做了一下SDOI2016R1D2,题好水啊随便AK 强行开map上SAM 每个状态的贡献就是\(Max(s)-M ...
- BZOJ_4516_[Sdoi2016]生成魔咒_后缀数组+ST表+splay
BZOJ_4516_[Sdoi2016]生成魔咒_后缀数组+ST表+splay Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔 ...
- [Sdoi2016]生成魔咒[SAM or SA]
4516: [Sdoi2016]生成魔咒 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1017 Solved: 569[Submit][Statu ...
随机推荐
- Mapreduce -- PageRank
PageRank 简单理解为网页排名,但是网页是根据什么排名的,接下来就简单介绍一下. 举例: 假设网页 A 的内容中有网页 B,C 和 D 的链接,并且 A 的 PageRank的值为0.25. 那 ...
- TPM及TSS协议栈的安装使用
TPM及TSS协议栈的安装 标签: 可信计算. 目录 安装环境介绍 TPM及TSS安装 软件包下载 TPM 安装 安装TSS 安装tpm-tools 交互过程 编写代码测试TPM是否可用 编写代码测试 ...
- 20155336 虎光元《网络攻防》Exp2后门原理与实践
20155336 虎光元<网络攻防>Exp2后门原理与实践 一.实验内容 (1)使用netcat获取主机操作Shell,cron启动 (0.5分) (2)使用socat获取主机操作Shel ...
- STM32通用定时器原理
/************************************************************************************************ 转载 ...
- Android 实现 WheelView
wheel view 目录(?)[-] Android WheelView效果图 网上的开源代码 实现思路 扩展Gallery 如何使用 我们都知道,在iOS里面有一种控件------滚筒控件(Whe ...
- javascript典型bug——错误的闭包
昨天QT给我的一个功能提了一个bug.大概意思就是说,一段在不同位置都会被调用的代码,在A处被调用的时候,似乎会对其他调用的地方产生影响. 我仔细debug了半天,终于找到了原因.简化过的代码如下: ...
- Scrapyd+Gerapy部署Scrapy爬虫进行可视化管理
Scrapy是一个流行的爬虫框架,利用Scrapyd,可以将其部署在远程服务端运行,并通过命令对爬虫进行管理,而Gerapy为我们提供了精美的UI,可以在web页面上直接点击操作,管理部署在scrap ...
- 7. Reverse Integer【Leetcode by java】
Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321 Examp ...
- oracle创建用户和角色、管理授权以及表空间操作
show user 显示当前用户connect username/password@datebasename as sysdba 切换用户和数据库 和用户身份 Oracle登录身份有三种: norma ...
- PowerTeam--Alpha阶段个人贡献分及转会人员
PowerTeam--Alpha阶段个人贡献分 我们的团队共有6人,总分300分. 经团队成员通过个人申请以及组内投票的方式,最终的等级评定如下面的等级评定矩阵所示: β1 β2 β3 γ1 γ2 ...