首先有两个结论:
1.后缀自动机具有最简性,即每种不同的子串只会在sam上体现一次,体现形式是sam上一条由root出发的路径。
2.一个字符串不同子串的个数等于所有关键节点的max(x)-min(x)+1。证明就是考虑后缀自动机的最简性。

然后,这就是个水题了。
每次插入一个字符后,更新答案即可。

#include<iostream>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<ctime>
#include<map>
#include<cstdlib>
#include<algorithm>
#define N 330000
#define L 300000
#define eps 1e-7
#define inf 1e9+7
#define ll long long
using namespace std;
inline int read()
{char ch=0;int x=0,flag=1;while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*flag;
}
char ch[N];
bool flag[N];
int root=1,size=1,last=1,id[N];
struct node{int len,link;map<int,int>nxt;}s[N];
void insert(int k)
{int cur=++size,p=last;s[cur].len=s[p].len+1;while(p&&!s[p].nxt[k]){s[p].nxt[k]=cur;p=s[p].link;}last=cur;if(!p){s[cur].link=root;return;}int q=s[p].nxt[k];if(s[q].len==s[p].len+1)s[cur].link=q;else{int clone=++size;s[clone]=s[q];s[clone].len=s[p].len+1;while(p&&s[p].nxt[k]==q){s[p].nxt[k]=clone;p=s[p].link;}s[q].link=s[cur].link=clone;}
}
int main()
{ll ans=0;int n=read();for(int i=1;i<=n;i++){int x=read();insert(x);ans+=s[last].len-s[s[last].link].len;printf("%lld\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/Creed-qwq/p/10159601.html

luogu P4070 [SDOI2016]生成魔咒相关推荐

  1. P4070 [SDOI2016]生成魔咒

    P4070 [SDOI2016]生成魔咒 题意: 有n个字符xi,每次在S的末尾加入一个字符,(一开始S为空),每次加入xi后的不相同字串有多少个 题解: 做这个题首先要会后缀数组P3809 [模板] ...

  2. 洛谷 P4070 [SDOI2016]生成魔咒 解题报告

    P4070 [SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 \(1\).\(2\) 拼凑起来形成一个魔咒串 \([1,2]\). 一个魔咒 ...

  3. bzoj4516 / P4070 [SDOI2016]生成魔咒

    P4070 [SDOI2016]生成魔咒 后缀自动机 每插入一个字符,对答案的贡献为$len[last]-len[fa[last]]$ 插入字符范围过大,所以使用$map$存储. (去掉第35行就是裸 ...

  4. P4070 [SDOI2016]生成魔咒(SAM len数组的含义)

    [SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 , 2 1,2 1,2 拼凑起来形成一个魔咒串 [ 1 , 2 ] [1,2] [1, ...

  5. 洛谷 P4070 [SDOI2016]生成魔咒 后缀自动机

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

  6. P4070 [SDOI2016]生成魔咒(SAM)

    传送门 用后缀数组做的真的心累 后缀数组+ST表+反串思维+set(或平衡树)动态维护 h e i g h t height height数组 然后用 S A M SAM SAM就是模板题- 要求本质 ...

  7. [SDOI2016]生成魔咒

    4516: [Sdoi2016]生成魔咒 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1460  Solved: 835 [Submit][Sta ...

  8. BZOJ4516: [Sdoi2016]生成魔咒

    BZOJ4516: [Sdoi2016]生成魔咒 Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示. 例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒 ...

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

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

最新文章

  1. linux输出重定向%3e退出,Linux学习笔记——第二章:Linux的用户接口与文本编辑器...
  2. java 根据ip获取dns_Java技巧: 根据网址查询DNS/IP地址
  3. 初识jvm-1.Java类的加载机制
  4. soap header身份认证 不带ns标签
  5. eureka自我保护时间_阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默...
  6. 佛经上181条做人的道理
  7. hybris导出系统已有数据的两种方式
  8. iOS中NSString转换成HEX(十六进制)-NSData转换成int
  9. mysql 集群架构_mysql企业常用集群架构
  10. 年薪40W,如何高效准备大厂AI算法岗面试?
  11. 分布式代码管理系统Git实践
  12. NYOJ-数独(dfs)
  13. if name==main是什么意思_Python中if __name__ == quot;__main__quot;:是什么意思
  14. java 面向对象之内存管理
  15. curl上传图片的大坑
  16. java基础之URLDecoder异常解决方法
  17. html返回顶部开始隐藏,回到顶部并且监听顶部按钮显示或隐藏
  18. httpwatch初级使用
  19. Android 高效安全加载图片
  20. jle汇编_JNB, JBE, JGE, JLE 指令的转移条件 5

热门文章

  1. sed for windows 双引号内部内容的替换
  2. 用Node-Inspector调试NodeJs程序
  3. javascript动态添加删除行后行内计算及取值
  4. 在JScript中运行应用程序
  5. Transformer 是万能的吗?
  6. 百度刷新世界级权威DeepFake防伪数据集榜单记录,成绩超越SOTA
  7. 重磅!彭博社“机器学习基础”教程视频及讲义下载
  8. python批处理将图片进行放大实例代码
  9. 为什么别人学python比你快?那是因为你没掌握这几点,多注意哦~
  10. 今年后,再见Excel,你好python