传送门

samsamsam入门题。

题意简述:给出一个串让你依次插入字符,求每次插入字符之后不同子串的数量。


显然每次的变化量只跟新出现的nnn个后缀有关系,那么显然就是maxlenp−maxlenlinkpmaxlen_p-maxlen_{link_p}maxlenp​−maxlenlinkp​​。

注意到字符集很大,可以用mapmapmap来维护转移边。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
const int N=2e5+5;
int n;
typedef long long ll;
ll ans=0;
struct SAM{
	int tot,last,len[N],link[N];
	map<int,int>son[N];
	SAM(){last=tot=1,len[0]=-1;}
	inline void expand(int x){
		int p=last,np=++tot;
		len[last=np]=len[p]+1;
		while(p&&!son[p][x])son[p][x]=np,p=link[p];
		if(!p)link[np]=1;
		else{
			int q=son[p][x],nq;
			if(len[q]==len[p]+1)link[np]=q;
			else{
				len[nq=++tot]=len[p]+1,son[nq]=son[q],link[nq]=link[q],link[q]=link[np]=nq;
				while(p&&son[p][x]==q)son[p][x]=nq,p=link[p];
			}
		}
		ans+=(ll)len[np]-len[link[np]];
	}
}sam;
int main(){
	n=read();
	for(ri i=1;i<=n;++i)sam.expand(read()),cout<<ans<<'\n';
	return 0;
}

2018.12.23 bzoj4516: [Sdoi2016]生成魔咒(后缀自动机)的更多相关文章

  1. BZOJ4516: [Sdoi2016]生成魔咒 后缀自动机

    #include<iostream> #include<cstdio> #include<cstring> #include<queue> #inclu ...

  2. [bzoj4516][Sdoi2016]生成魔咒——后缀自动机

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

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

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

  4. BZOJ4516: [Sdoi2016]生成魔咒(后缀数组 set RMQ)

    题意 题目链接 Sol 毒瘤SDOI 终于有一道我会做的题啦qwq 首先,本质不同的子串的个数 $ = \frac{n(n + 1)}{2} - \sum height[i]$ 把原串翻转过来,每次就 ...

  5. [SDOI2016]生成魔咒(后缀自动机)

    /* 水题, 根据性质做就行, nq不会对答案产生贡献, 那么只算p的贡献就好了 */ #include<cstdio> #include<algorithm> #includ ...

  6. BZOJ.4516.[SDOI2016]生成魔咒(后缀自动机 map)

    题目链接 后缀数组做法见这. 直接SAM+map.对于每个节点其产生的不同子串数为len[i]-len[fa[i]]. //15932kb 676ms #include <map> #in ...

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=4516 http://blog.csdn.net/doyouseeman/article/detail ...

  8. BZOJ 4516 [Sdoi2016]生成魔咒 ——后缀自动机

    本质不同的字串,考虑SA的做法,比较弱,貌似不会. 好吧,只好用SAM了,由于后缀自动机的状态最简的性质, 所有不同的字串就是∑l[i]-l[fa[i]], 然后后缀自动机是可以在线的,然后维护一下就 ...

  9. [SDOI2016] 生成魔咒 - 后缀数组,平衡树,STL,时间倒流

    [SDOI2016] 生成魔咒 Description 初态串为空,每次在末尾追加一个字符,动态维护本质不同的子串数. Solution 考虑时间倒流,并将串反转,则变为每次从开头删掉一个字符,即每次 ...

随机推荐

  1. 100-days:nine

    Title: Boeing(波音飞机) crash isolates FAA as(伴随,随着) China leads push against Max(出事机型,即737 Max) crash n ...

  2. 100-days: Four

    Title: Weekend 'catch-up sheep' is a lie catch-up n.补做:赶做 play catch-up 通过追赶,达到同样的水平或程度 catch-up sle ...

  3. vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法

    原文:http://www.jb51.net/article/129270.htm main.js入口文件配合vue-router写这个 router.afterEach((to,from,next) ...

  4. Kylin Cube构建过程优化

    原文地址:https://kylin.apache.org/docs16/howto/howto_optimize_build.html Kylin将一个cube的build过程分解为若干个子步骤,然 ...

  5. To be a better me

    2017.4.15 突然成为前端实习生.做了两个周的官网项目,主要是更新官网一些文字图片以及新加一个页面,因为是静态页面,所以熟悉了代码就上手了.幸好没出什么差错. 两周后,实习结束. 2017.7. ...

  6. xcode10 - 打ipa上蒲公英或者fire.im

    1.选择空设备 2. 3. 4. 选择需要的 next 5. 6. 7. 8.选择位置 9. 选择ipa包 放到蒲公英 或者fire.im上 就行了

  7. 永久激活win和office

    1.关闭自己安装的防护软件 2. 关闭电脑自带的防护软件 3.运行 KMSpico

  8. 我的第一个博客——Fragment遇到的问题

    最近项目中使用fragment时遇到了一些问题: 1.fragment的刷新问题. 解决:我的情况是有多个fragment时,只需要刷新其中几个界面.之前我在网上看到的一些方法.如下: 首先在Adap ...

  9. vs2017连接mysql以及问题汇总

    https://www.cnblogs.com/eye-like/p/8494355.html https://blog.csdn.net/u012658972/article/details/791 ...

  10. c#特性attribute:

    特性是被编译到metadata中,  是提供给反射用的. 特性attribute:1 什么是attribute,和注释有什么区别 2 声明和使用attribute3 使用attribute完成扩展4 ...