题目传送门

题目大意: 给出一个字符串,询问它的每一个前缀内包含多少个不同的子串。

题解

将字符一个一个加入到SAM里,每个新的字符的的贡献为 l e n ( x ) − l e n ( l i n k ( x ) ) len(x)-len(link(x)) len(x)−len(link(x)),因为从 l e n ( l i n k ( x ) ) len(link(x)) len(link(x)) 这个长度开始,下面的长度的后缀都已经出现过了,只有上面的后缀是没出现过的,即新的不同的子串。

代码如下:

#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
#define maxn 200010int n;
long long ans=0;
struct state{int len,link;map<int,int> next;
}st[maxn];
int id=0,last=0,now,p,q;
void extend(int x)
{now=++id;st[now].len=st[last].len+1;for(p=last;p!=-1&&!st[p].next.count(x);p=st[p].link)st[p].next[x]=now;if(p!=-1){q=st[p].next[x];if(st[p].len+1==st[q].len)st[now].link=q;else{int clone=++id;st[clone]=st[q];st[clone].len=st[p].len+1;for(;p!=-1&&st[p].next[x]==q;p=st[p].link)st[p].next[x]=clone;st[q].link=st[now].link=clone;}}last=now;
}int main()
{scanf("%d",&n);st[0].link=-1;for(int i=1,x;i<=n;i++){scanf("%d",&x);extend(x);ans+=st[now].len-st[st[now].link].len;printf("%lld\n",ans);}
}

SDOI 2016 生成魔咒 题解相关推荐

  1. BZOJ4516: [Sdoi2016]生成魔咒

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

  2. P4070 [SDOI2016]生成魔咒

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

  3. 【刷题】BZOJ 4516 [Sdoi2016]生成魔咒

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

  4. [SDOI2016]生成魔咒

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

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

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

  6. [SDOI2016] 生成魔咒(后缀数组SA + st表 + set)动态不同子串个数

    problem luogu-P4070 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1,21,21,2 拼凑起来形成一个魔咒串 [1,2][1,2][1,2]. 一个魔咒串 ...

  7. 【ACWing】2572. 生成魔咒

    题目地址: https://www.acwing.com/problem/content/2574/ 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 , 2 1, 2 1,2 ...

  8. 【SDOI2016】生成魔咒

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

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

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

最新文章

  1. NodeJS基础2---2 Promise详解
  2. ubuntu部署java环境
  3. NDK,动态链接库,JNI
  4. Linux系统中为php添加pcntl扩展的方法
  5. Linux 免密登录和配置环境变量
  6. db2 兼容 oracle 语法,db2 case when和oracle兼容有关问题
  7. 洛谷 1373 dp 小a和uim之大逃离 良心题解
  8. python海龟图画龙珠_DeepOps的Python小笔记-天池龙珠计划-Python训练营-Task 02:DAY5
  9. 【sklearn第二十二讲】协方差估计
  10. C# XmlReader
  11. base64减少图片请求
  12. 爬虫常用的user_agent
  13. CAD快捷键命令------画矩形
  14. littleVGL开发(8):消息弹窗控件(lv_mbox)
  15. 超低功耗摄像头 门锁 猫眼
  16. 拼多多 标题 html,【拼多多如何变成新用户】拼多多老用户变新用户教程_拼多多砍价网...
  17. 如何快速给食物照片调色
  18. 镜像 网站 linux 程序,腾讯开源镜像网站(腾讯云软件源)地址,附使用说明
  19. 分布式锁-Redis解决方案和Redisson解决方案
  20. 高精度加法 高精度减法 高度除法 高精度乘法 方法总结

热门文章

  1. Lua 中 table(表) 的简单使用
  2. linux解决挖矿病毒
  3. plc-300c语言编程,PLC初学者必备:7个PLC经典编程
  4. 刚入门软件测试行业的女生就能月薪过万骗局解秘
  5. Spring中经常用到的注解提交方式@Postmapping、@GetMapping、@PutMapping、DeleteMapping
  6. mysql or不走索引分析
  7. 蓝屏0x00000050的解决方法
  8. AUTOSAR架构的CAN通讯
  9. 对于本人的毕业设计(哭)
  10. 102美金一周获利超6倍的交易心得