[SDOI2016]生成魔咒(后缀自动机)
看一眼题。本质不同的字串数。
嘴角微微上扬。
每一次加一个数输出一个答案。
笑容渐渐消失。
等等,\(SAM\)好像也可以求本质不同的字串。
设当前字符串用\(x\)表示,每次插入完成后\(ans\)加上\(len[x]-len[fa]\)就行了。
嘴角微微上扬。
等等,炸空间了。
笑容渐渐消失。
用\(map\)不就得了。
嘴角再次上扬。
写完过了。
笑出了声。
翻题解,时看到了\(SA\)。
笑容渐渐僵硬。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
#define int long long
const int N=101000;
int n,ans;
struct SAM{
int tot,u,len[N*2],fa[N*2];
map<int,int>trans[N*2];
void init(){tot=u=1;}
void ins(int c){
int x=++tot;len[x]=len[u]+1;
for(;u&&trans[u][c]==0;u=fa[u])trans[u][c]=x;
if(u==0)fa[x]=1,ans+=len[x];
else{
int v=trans[u][c];
if(len[u]+1==len[v])fa[x]=v,ans+=len[x]-len[v];
else{
int w=++tot;len[w]=len[u]+1;
trans[w]=trans[v];
fa[w]=fa[v];
fa[x]=fa[v]=w;
ans+=len[x]-len[w];
for(;u&&trans[u][c]==v;u=fa[u])trans[u][c]=w;
}
}
u=x;
}
}sam;
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
signed main(){
n=read();
sam.init();
for(int i=1;i<=n;i++){
sam.ins(read());
printf("%lld\n",ans);
}
return 0;
}
[SDOI2016]生成魔咒(后缀自动机)的更多相关文章
- BZOJ4516: [Sdoi2016]生成魔咒 后缀自动机
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #inclu ...
- BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
4516: [Sdoi2016]生成魔咒 题意:询问一个字符串每个前缀有多少不同的子串 做了一下SDOI2016R1D2,题好水啊随便AK 强行开map上SAM 每个状态的贡献就是\(Max(s)-M ...
- [bzoj4516][Sdoi2016]生成魔咒——后缀自动机
Brief Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生 ...
- BZOJ 4516: [Sdoi2016]生成魔咒 后缀自动机 性质
http://www.lydsy.com/JudgeOnline/problem.php?id=4516 http://blog.csdn.net/doyouseeman/article/detail ...
- BZOJ 4516 [Sdoi2016]生成魔咒 ——后缀自动机
本质不同的字串,考虑SA的做法,比较弱,貌似不会. 好吧,只好用SAM了,由于后缀自动机的状态最简的性质, 所有不同的字串就是∑l[i]-l[fa[i]], 然后后缀自动机是可以在线的,然后维护一下就 ...
- BZOJ.4516.[SDOI2016]生成魔咒(后缀自动机 map)
题目链接 后缀数组做法见这. 直接SAM+map.对于每个节点其产生的不同子串数为len[i]-len[fa[i]]. //15932kb 676ms #include <map> #in ...
- [SDOI2016]生成魔咒(后缀自动机)
/* 水题, 根据性质做就行, nq不会对答案产生贡献, 那么只算p的贡献就好了 */ #include<cstdio> #include<algorithm> #includ ...
- [SDOI2016] 生成魔咒 - 后缀数组,平衡树,STL,时间倒流
[SDOI2016] 生成魔咒 Description 初态串为空,每次在末尾追加一个字符,动态维护本质不同的子串数. Solution 考虑时间倒流,并将串反转,则变为每次从开头删掉一个字符,即每次 ...
- 【bzoj4516】[Sdoi2016]生成魔咒 后缀数组+倍增RMQ+STL-set
题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2].一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1,2 ...
- BZOJ.4516.[SDOI2016]生成魔咒(后缀数组 RMQ)
题目链接 后缀自动机做法见这(超好写啊). 后缀数组是可以做的: 本质不同的字符串的个数为 \(子串个数-\sum_{ht[i]}\),即 \(\frac{n(n+1)}{2}-\sum_{ht[i] ...
随机推荐
- 11gR2 集群(CRS/GRID)新功能—— SCAN(Single Client Access Name)
https://blogs.oracle.com/database4cn/11gr2-crsgrid-scansingle-client-access-name
- [bzoj4659\2694]Lcm_数论_莫比乌斯反演
Lcm bzoj-4659 bzoj-2694 题目大意:给出A,B,考虑所有满足l<=a<=A,l<=b<=B,且不存在n>1使得n^2同时整除a和b的有序数对(a,b ...
- SecureCRTPortal保存的密码位置
SecureCRTPortal保存的密码位置 Options> Global Options > Configuration Folder 一般为:C:\Users\Administrat ...
- Meteor 前端 RESTful API 通过后端 API 下载文件
Meteor 下载文件 问题场景 后端 HTTP server提供一个下载接口,可是须要前端 Meteor 可以给浏览器用户开一个URL来下载这个文件. 举例:在线的Meteor Logo文件就好比后 ...
- HDU 2255 奔小康赚大钱 KM算法题解
KM算法求的是完备匹配下的最大权匹配,是Hungary算法的进一步,由于Hungary算法是最大匹配的算法,不带权. 经典算法,想不出来的了,要參考别人的.然后消化吸收吧. 由于真的非常复杂的算法. ...
- Squares-暴力枚举或者二分
B - Squares Time Limit:3500MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- 屏幕測试亮点,新买了一个显示器,使用web简单的測试下了亮点
1,购买了一个新的显示器 趁着双11的时候价格廉价.入手了一个显示器. http://serve.netsh.org/pub/dead_pixel.bin 滚动下就能够换颜色了.把chrome最大化, ...
- js自定义回调函数
JavaScript允许开发人员像传递任何类型的数据一样传递函数,也就是说,函数也是一种数据类型,通过typeof就知道. 例子1: var CallbackFun = function(){ t ...
- Oracle 10G 中的"回收站"
在Oracle 10g数据库中,引入了一个回收站(Recycle Bin)的数据库对象. 回收站,从原理上来说就是一个数据字典表,放置用户Drop掉的数据库对象信息.用户进行Drop操作的对象并没有被 ...
- [Pulgin] jQuery插件之ajaxFileUpload
一.ajaxFileUpload是一个异步上传文件的jQuery插件. 传一个不知道什么版本的上来,以后不用到处找了. 语法:$.ajaxFileUpload([options]) options参数 ...