[SDOI2016]生成魔咒

题目描述

魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 1 , 2 1,2 1,2 拼凑起来形成一个魔咒串 [ 1 , 2 ] [1,2] [1,2]。

一个魔咒串 S S S 的非空字串被称为魔咒串 S S S 的生成魔咒。

例如 S = [ 1 , 2 , 1 ] S=[1,2,1] S=[1,2,1] 时,它的生成魔咒有 [ 1 ] , [ 2 ] , [ 1 , 2 ] , [ 2 , 1 ] , [ 1 , 2 , 1 ] [1],[2],[1,2],[2,1],[1,2,1] [1],[2],[1,2],[2,1],[1,2,1] 五种。 S = [ 1 , 1 , 1 ] S=[1,1,1] S=[1,1,1] 时,它的生成魔咒有 [ 1 ] , [ 1 , 1 ] , [ 1 , 1 , 1 ] [1],[1,1],[1,1,1] [1],[1,1],[1,1,1] 三种,最初 S 为空串。

共进行 n n n 次操作,每次操作是在 S S S 的结尾加入一个魔咒字符。每次操作后都需要求出,当前的魔咒串 S S S 共有多少种生成魔咒。

输入格式

第一行一个整数 n n n。

第二行 n n n 个数,第 i i i 个数表示第 i i i 次操作加入的魔咒字符 x i x_i xi​。

输出格式

输出 n n n 行,每行一个数。
第 i i i 行的数表示第 i i i 次操作后 S S S 的生成魔咒数量

样例 #1

样例输入 #1

7
1 2 3 3 3 1 2

样例输出 #1

1
3
6
9
12
17
22

提示

数据规模与约定

对于 10 % 10\% 10% 的数据,保证 1 ≤ n ≤ 10 1 \le n \le 10 1≤n≤10;
对于 30 % 30\% 30% 的数据,保证 1 ≤ n ≤ 100 1 \le n \le 100 1≤n≤100;
对于 60 % 60\% 60% 的数据,保证 1 ≤ n ≤ 1 0 3 1 \le n \le 10^3 1≤n≤103;
对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1≤n≤105, 1 ≤ x i ≤ 1 0 9 1 \leq x_i \leq 10^9 1≤xi​≤109。

题意:

给定 n 次插入字符串操作,要求求出每次插入一个字符时,当前字符串包含的本质不同子串的数量。

思路:

我们知道,后缀链接树上存储了一个字符串的所有子串,我们可以把当前的答案看做是树上所有节点包含的子串数量总和,树上每个节点 u 包含的子串数量为:len[u] - len[fa[u]],当插入一个字符,给答案造成了贡献,我们等价地看成是新创建了个节点 np,这个操作对于答案的贡献为即为 len[np] - len[fa[np]]。

因此具体做法就是,每进行extend一个字符的时候,对于答案累加上应有的贡献即可。

时间复杂度:

O ( n ) O(n) O(n)

代码:

#include<bits/stdc++.h>using namespace std;
typedef long long ll;
const int N = 1e5 + 10, M = N << 1;
int n, fa[M], len[M], tot = 1, np = 1;
unordered_map<int, unordered_map<int, int>> ch;
vector<int> g[M];
string s;
ll sum = 0;void extend(int c)
{int p = np; np = ++tot;len[np] = len[p] + 1;while (p && !ch[p][c]) {ch[p][c] = np;p = fa[p];}if (!p) {fa[np] = 1;}else {int q = ch[p][c];if (len[q] == len[p] + 1) {fa[np] = q;}else {int nq = ++tot;len[nq] = len[p] + 1;fa[nq] = fa[q], fa[q] = fa[np] = nq;while (p && ch[p][c] == q) {ch[p][c] = nq;p = fa[p];}ch[nq] = ch[q];}}sum += (len[np] - len[fa[np]]);
}signed main()
{cin >> n;for (int i = 0; i < n; ++i) {int c; cin >> c;extend(c);printf("%lld\n", sum);}return 0;
}

P4070 [SDOI2016]生成魔咒(SAM len数组的含义)相关推荐

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

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

  2. P4070 [SDOI2016]生成魔咒

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

  3. 洛谷 P4070 [SDOI2016]生成魔咒 解题报告

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

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

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

  5. [SDOI2016] 生成魔咒(后缀数组SA + st表 + set)动态不同子串个数

    problem luogu-P4070 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1,21,21,2 拼凑起来形成一个魔咒串 [1,2][1,2][1,2]. 一个魔咒串 ...

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

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

  7. luogu P4070 [SDOI2016]生成魔咒

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

  8. BZOJ4516: [Sdoi2016]生成魔咒

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

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

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

最新文章

  1. sql server修改索引名称_【索引潜规则】覆盖索引、ICP、MRR详解
  2. java8新特性之lambda表达式(及方法引用与构造器引用)
  3. 好端端的程序员,咋就成了新生代农民工!
  4. 单片机机器周期怎么计算公式_单片机定时器周期计算公式
  5. Java中Timer的用法
  6. php里面get和post请求,php中GET和POST请求发送几种方法总结
  7. 使用 做签名的post_使用 Go 添加 JWT 认证
  8. LogServer日志详解
  9. 51单片机呼吸灯c语言程序,用51单片机的呼吸灯程序
  10. 反编译exe文件并替换图片资源
  11. idea设置控制台字体大小
  12. 2018,人生是一条蛇,它咬着自己的尾巴
  13. centos(一)安装及 设置基础软件仓库出错 的问题
  14. Unity 5.3 官方VR教程(—)VR综述
  15. 定义一个图形抽象类,完成三角形、圆形、矩形的周长和面积计算
  16. php汉字转为拼音方法一
  17. cpp课程设计实验题:定义一个描述学生(Student)基本情况的类,数据成员包括姓名(name)、学号(num)、数学成绩(mathScore)、英语成绩(englishScore)、人数(coun
  18. 扇贝编程python认知课_‎扇贝编程-人人能学会的python课 in de App Store
  19. dwg文件怎么打开呢?dwg是啥呢?
  20. 微信PC版重大更新!电脑上也能玩小游戏了

热门文章

  1. Web前端工程师面试题汇总(一)
  2. USB设备绑定固定端口
  3. 300亿只蝉本月中将从地底涌出侵袭美国
  4. 第三方投票自动化刷投票脚本代码
  5. 有限元常用材料汇总【持续更新】
  6. 一个多神的地方,然而到底有多少神灵呢
  7. 【项目总结】玛嘉环境物联网平台(大三学生独立完成的真实企业外包项目)/网脉通用物联网平台/网脉铁塔监测系统
  8. ZCMU 1265: 数三角形
  9. 2006-京淘Day02-3
  10. 汽车连杆精工加机床solidworks设计鳞辊输送机3D图纸 Solidworks设计伺服冲料机 proe可打开夹具夹紧机构3D数模图纸 x_t格式粉尘料位检测机构辊子输送机STP