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]生成魔咒 解题报告相关推荐

  1. 洛谷 P4070 [SDOI2016]生成魔咒 后缀自动机

    题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1, ...

  2. P4070 [SDOI2016]生成魔咒

    P4070 [SDOI2016]生成魔咒 题意: 有n个字符xi,每次在S的末尾加入一个字符,(一开始S为空),每次加入xi后的不相同字串有多少个 题解: 做这个题首先要会后缀数组P3809 [模板] ...

  3. bzoj4516 / P4070 [SDOI2016]生成魔咒

    P4070 [SDOI2016]生成魔咒 后缀自动机 每插入一个字符,对答案的贡献为$len[last]-len[fa[last]]$ 插入字符范围过大,所以使用$map$存储. (去掉第35行就是裸 ...

  4. P4070 [SDOI2016]生成魔咒(SAM len数组的含义)

    [SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 , 2 1,2 1,2 拼凑起来形成一个魔咒串 [ 1 , 2 ] [1,2] [1, ...

  5. luogu P4070 [SDOI2016]生成魔咒

    首先有两个结论: 1.后缀自动机具有最简性,即每种不同的子串只会在sam上体现一次,体现形式是sam上一条由root出发的路径. 2.一个字符串不同子串的个数等于所有关键节点的max(x)-min(x ...

  6. P4070 [SDOI2016]生成魔咒(SAM)

    传送门 用后缀数组做的真的心累 后缀数组+ST表+反串思维+set(或平衡树)动态维护 h e i g h t height height数组 然后用 S A M SAM SAM就是模板题- 要求本质 ...

  7. [SDOI2016]生成魔咒

    4516: [Sdoi2016]生成魔咒 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1460  Solved: 835 [Submit][Sta ...

  8. BZOJ4516: [Sdoi2016]生成魔咒

    BZOJ4516: [Sdoi2016]生成魔咒 Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示. 例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒 ...

  9. BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]

    4516: [Sdoi2016]生成魔咒 题意:询问一个字符串每个前缀有多少不同的子串 做了一下SDOI2016R1D2,题好水啊随便AK 强行开map上SAM 每个状态的贡献就是\(Max(s)-M ...

最新文章

  1. 105.通信同步异步定义及其相关
  2. sqlsever无法重新启动计算机,有关SqlServer 2008安装及卸载的一些问题,安装检测时显示重新启动计算机....
  3. js操作json数据的一些感受
  4. Linux服务器运行环境搭建(二)——Redis数据库安装
  5. p批处理替换目录下文本中的字符串
  6. celery java_Python的Java Celery项目相当于什么?
  7. 《C++标准程序库》——STL迭代器
  8. alreader 2 android,AlReader2
  9. 课程设计matlab仿真,MATLAB与仿真系统课程设计报告
  10. 计算机ip怎么换路由器,路由器怎么换ip地址
  11. c语言中复合语句不用花括号,【单选题】C语言中,可将一系列语句置于( )从而构成复合语句。 A. 一对尖括号\ \之间 B. 一对圆括号\( )\之间 C. 一对花括号 { } 之间 D....
  12. 输出满足某种条件的素数(C语言)
  13. 最强nba体验服显示服务器正在停机,最强nba体验服安装包
  14. Kutools for Excel 结合 300 多种高级功能和工具
  15. mysql jdbc驱动 批量更新_jdbc批量插入,删除,更新
  16. php++内购续期订阅,iOS内购:自动续期订阅总结
  17. 2022:RadiAnt DICOM Viewer-PC+CD[U盘]
  18. 马哥教育大数据专家:深入解读大数据的就业前景
  19. 《薛兆丰的经济学课》课程总结3--生命有限
  20. 详解六种常见的上下文切换场景

热门文章

  1. Java架构师必会的技能
  2. 工厂模式详解(简单工厂模式,工厂方法模式,抽象工厂模式,只给出抽象工厂模式具体代码)
  3. html中嵌套iframe页面
  4. KOFLive Beta版本发布!
  5. LeetCode算法题6:贪心 - 跳跃游戏
  6. SUMO入门(三) - 路网
  7. 精通javapython拼写_异步图书 精通Python自然语言处理 高清文字版PDF下载
  8. html语言搭建网站,网络编程(1)——使用HTML搭建一个网页
  9. Vue.js 源码分析—— Slots 是如何实现的
  10. 消费者认可度提高,戴比尔斯计划将培育钻石推向“时尚类”领域