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]…
题目大意:有一个字符串,每次在末尾加入一个字符,问当前共有多少个本质不同的字串 题解:$SAM$,就是问插入这个字符后,多了多少个字串,就是当前这个点的$Right$数组大小. 卡点:无 C++ Code: #include <cstdio> #include <iostream> #include <map> #define maxn 100010 long long ans; namespace SAM { #define N (maxn << 1) #…
题目地址: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…
题目链接 \(Click\) \(Here\) 其实是看后缀数组资料看到这个题目的,但是一眼反应显然后缀自动机,每次维护添加节点后的答案贡献即可,唯一不友好的一点是需要平衡树维护,这里因为复杂度不卡而且也不需要用到\(ch\)数组的遍历访问,我采用了\(map\)的写法. 其实是因为不会平衡树维护啦,如果有机会还是要学一下啊..这个题可是没给不用平衡树的部分分啊\(Qwq\)(直接全体\(1e9\)) #include <bits/stdc++.h> using namespace std;…
[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…
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…