【LG4070】[SDOI2016]生成魔咒】的更多相关文章

[LG4070][SDOI2016]生成魔咒 题面 洛谷 题解 如果我们不用在线输的话,那么答案就是对于所有状态\(i\) \[ \sum (i.len-i.fa.len) \] 现在我们需要在线询问,那么因为\(SAM\)是在线算法,我们考虑每次的对答案的贡献. 那么产生的贡献就是\(last.len-last.fa.len\). 与\(yyb\)的对话: Q:为什么构建自动机时中间过程新加的点不会算到最后答案中呢? A:不影响答案啊,你在两个len之间断开,对于答案的贡献不变. 代码 #in…
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> #include<algorithm> #include<cstdlib> #include<map> #define N 200005 #define ll long long using namespace std; int read()…
4516: [Sdoi2016]生成魔咒 题意:询问一个字符串每个前缀有多少不同的子串 做了一下SDOI2016R1D2,题好水啊随便AK 强行开map上SAM 每个状态的贡献就是\(Max(s)-Min(s)+1\) 插入的时候维护一下就行了 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #includ…
BZOJ_4516_[Sdoi2016]生成魔咒_后缀数组+ST表+splay Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 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…
题目地址:P4070 [SDOI2016]生成魔咒 相信看到题目之后很多人跟我的思路是一样的-- 肯定要用 SA(P3809 [模板]后缀排序) 肯定要会求本质不同的子串个数(P2408 不同子串个数) 然后?就不会了...... 瓶颈在哪儿? 你会发现每往后添加一个字符,整个 sa 数组只会插入一个数,要维护不难 但是 height 会无规律变化,这就导致无法高效维护 怎么办呢? 倒置字符串 我们将整个字符串倒置过来 显然本质不同的子串个数不会变化 而每往前添加一个字符串, height 的变…
P4070 [SDOI2016]生成魔咒 后缀自动机 每插入一个字符,对答案的贡献为$len[last]-len[fa[last]]$ 插入字符范围过大,所以使用$map$存储. (去掉第35行就是裸的板子了.) #include<iostream> #include<cstdio> #include<cstring> #include<cctype> #include<map> using namespace std; void read(in…
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]…
4516: [Sdoi2016]生成魔咒 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1017  Solved: 569[Submit][Status][Discuss] Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1,2,1] 时,它的生成魔咒有 [1].[2].[1,2].[2…
4516: [Sdoi2016]生成魔咒 链接 题意: 求本质不同的子串. 分析: 后缀数组或者SAM都可以. 考虑SAM中每个点的可以表示的子串是一个区间min(S)~max(S),把每个点的这个区间加起来即可. 字符集有点大,可以用map. 代码: #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmath> #include…
[SDOI2016] 生成魔咒 Description 初态串为空,每次在末尾追加一个字符,动态维护本质不同的子串数. Solution 考虑时间倒流,并将串反转,则变为每次从开头删掉一个字符,即每次从后缀集合中删掉一个后缀. 预处理出后缀数组和高度数组后,用平衡树维护所有后缀集合(按照后缀排序),要删除一个后缀 \(S[sa[p],n]\) 时,找到它在平衡树上的前驱 \(u\) 和后继 \(v\) ,如果都存在,那么这一步的贡献就是 \[(n-sa[p]+1) - Max(h[p],h[v]…