BZOJ4516: [Sdoi2016]生成魔咒
果然SA比SAM+map快。
首先这是SAM裸题,然而SA求本质不同子串个数也很容易。考虑倒着建SA,这样没错加一个字符就变成加一个后缀,其他后缀都不变,那么i的答案就是只考虑前i个后缀的答案。搞个双向链表,每次删一个后缀并RMQ更新答案。
(SAM+map复杂度可能是错的,但是我不清楚)
#include<algorithm>
#include<cstdio>
#define lb lower_bound
using namespace std;
const int N=1e5+5;
typedef int arr[N];
arr sa,r,f[17],c,v,s,t,p,q;
typedef long long ll;
ll b,z[N];
void pre(int*s,int n){
for(int i=0;i<n;++i)
++c[s[i]];
for(int i=1;i<n;++i)
c[i]+=c[i-1];
for(int i=n-1;~i;--i)
sa[--c[s[i]]]=i;
int m=0;
for(int i=1;i<n;++i)
r[sa[i]]=s[sa[i]]!=s[sa[i-1]]?++m:m;
for(int j=1;;j<<=1){
if(++m==n)break;
for(int i=0;i<j;++i)
v[i]=n-j+i;
for(int i=0;i<m;++i)
c[i]=0;
for(int i=0,k=j;i<n;++i){
if(sa[i]>=j)
v[k++]=sa[i]-j;
++c[r[i]];
}
for(int i=1;i<m;++i)
c[i]+=c[i-1];
for(int i=n-1;~i;--i)
sa[--c[r[v[i]]]]=v[i],v[i]=r[i];
m=r[sa[0]]=0;
for(int i=1;i<n;++i)
r[sa[i]]=v[sa[i]]!=v[sa[i-1]]||v[sa[i]+j]!=v[sa[i-1]+j]?++m:m;
}
}
int ask(int i,int j){
int k=__lg(j-i+1);
return min(f[k][i],f[k][j-(1<<k)+1]);
}
struct buf{
char z[9<<17],*s;
buf():s(z){
z[fread(z,1,sizeof z,stdin)]=0;
}
operator int(){
int x=0;
while(*s<48)++s;
while(*s>32)
x=x*10+*s++-48;
return x;
}
}it;
int main(){
int n=it;
for(int i=n-1;~i;--i)
s[i]=t[i]=it;
sort(t,t+n);
for(int i=0;i<n;++i)
s[i]=lb(t,t+n,s[i])-t+1;
pre(s,n+1);
for(int i=0,j=0;i<n;++i){
if(j)--j;
while(s[i+j]==s[sa[r[i]-1]+j])++j;
f[0][r[i]]=j;
}
for(int j=1;n>>j;++j)
for(int i=0;i+(1<<j)-1<=n;++i)
f[j][i]=min(f[j-1][i],f[j-1][i+(1<<j-1)]);
for(int i=1;i<=n;++i)
b+=n-sa[i]-f[0][i];
for(int i=n;i>1;--i)
p[i]=i-1;
for(int i=1;i<n;++i)
q[i]=i+1;
for(int i=0;i<n;++i){
int j=r[i],k=0;
if(p[j])k=max(k,ask(p[j]+1,j));
if(q[j])k=max(k,ask(j+1,q[j]));
z[i]=b,b-=n-i-k;
p[q[j]]=p[j];
q[p[j]]=q[j];
}
for(int i=n-1;~i;--i)
printf("%lld\n",z[i]);
}
BZOJ4516: [Sdoi2016]生成魔咒的更多相关文章
- BZOJ4516: [Sdoi2016]生成魔咒 后缀自动机
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #inclu ...
- [bzoj4516][Sdoi2016]生成魔咒——后缀自动机
Brief Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生 ...
- BZOJ4516 [Sdoi2016]生成魔咒 【后缀自动机】
题目 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1,2, ...
- BZOJ4516 SDOI2016生成魔咒(后缀数组+平衡树)
一个字符串本质不同的子串数量显然是总子串数减去所有height值.如果一个个往里加字符的话,每次都会改动所有后缀完全没法做.但发现如果从后往前加的话,每次只会添加一个后缀.于是我们把字符串倒过来,每次 ...
- bzoj4516: [Sdoi2016]生成魔咒 sam
题意:每次插入一个数字,查询本质不同的子串有多少个 题解:sam,数字很大,ch数组用map来存,每次ins之后查询一下新建点表示多少个本质不同的子串(l[np]-l[fa[np]]) /****** ...
- 2018.12.23 bzoj4516: [Sdoi2016]生成魔咒(后缀自动机)
传送门 samsamsam入门题. 题意简述:给出一个串让你依次插入字符,求每次插入字符之后不同子串的数量. 显然每次的变化量只跟新出现的nnn个后缀有关系,那么显然就是maxlenp−maxlenl ...
- bzoj千题计划283:bzoj4516: [Sdoi2016]生成魔咒(后缀数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=4516 考虑在后面新加一个字母产生的影响 假设是第i个 如果不考虑重复,那么会增加i个不同的字符串 考 ...
- BZOJ4516: [Sdoi2016]生成魔咒(后缀数组 set RMQ)
题意 题目链接 Sol 毒瘤SDOI 终于有一道我会做的题啦qwq 首先,本质不同的子串的个数 $ = \frac{n(n + 1)}{2} - \sum height[i]$ 把原串翻转过来,每次就 ...
- BZOJ4516 SDOI2016生成魔咒(后缀自动机)
本质不同子串数量等于所有点的len-parent树上父亲的len的和.可以直接维护. #include<iostream> #include<cstdio> #include& ...
随机推荐
- 整理常用加密 iOS 与 Android 加密 MD5-SHA1
1.MD5算法 不可逆 128位或者64位串,byte数字长度就是16和8,一般表示是使用16进制来表示的话,1个byte转换成2个16bit,分别表示高地位,所以生成的字符串是16位或者是32位的, ...
- Android编码规范05
编码逻辑规范总结: 1.避免使用多个类放在一个文件里,除非是一次性使用的内部类 2.一个方法代码长度最好不要超过35行 3.原则上尽量不要修改自动生成的文件,如R文件 4.Final String 取 ...
- Web性能优化:基本思路和常用工具
听了荣华的演讲之后,我对性能优化有了更深层次的认识. 性能优化的重要性 性能优化是为了赢得用户,为了降低成本. 性能优化思路 Web常见优化点 Java常见排查工具
- yii2组件之多图上传插件FileInput的详细使用
作者:白狼 出处:http://www.manks.top/yii2_multiply_images.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 ...
- 如何定义好一个符合规范的url
描述 进公司没有多久遇到一个问题,定义的url会被大神吐槽说是很渣.之前从来没有注意这块,今天把我们团队的url规范分享给大家. 为什么需要URL规范化 1.网站URL和结构已经成为网站搜索引擎友好的 ...
- nginx在linux下安装
安装前先确认是否已经安装编译包和一些依赖包如果没有安装: yum install pcre* yum install openssl* yum install zlib yum install zli ...
- 2、实现不同子网之间的信息交流(互相可以PING通)
一.环境: 二个不同的虚拟子网 VMnet1: 192.168.155.0/24 VMnet8: 192.168.170.0/24 编辑 --> 虚拟网络编辑器 (查看自己的子网,相应修改就行) ...
- IO流中将字节流转成字符流的方法
//字节流--->字符流 1. public class TestIO { public static void main(String[] args) throws IOException { ...
- Java使用MyEclipse构建webService简单案例
什么是WebServices? 它是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行;它是一种新的web应用程序分支,是自包含.自描述.模块化的应用,可以发布.定位.通过web ...
- Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...