题目描述

魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 1、2 拼凑起来形成一个魔咒串 [1,2]。

一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒。

例如 S=[1,2,1] 时,它的生成魔咒有 [1]、[2]、[1,2]、[2,1]、[1,2,1] 五种。S=[1,1,1] 时,它的生成魔咒有 [1]、[1,1]、[1,1,1] 三种。最初 S 为空串。共进行 n 次操作,每次操作是在 S 的结尾加入一个魔咒字符。每次操作后都需要求出,当前的魔咒串 S 共有多少种生成魔咒。

输入输出格式

输入格式:
第一行一个整数 n n n。

第二行 n" role="presentation" style="position: relative;">nnn 个数,第 i i i 个数表示第 i" role="presentation" style="position: relative;">iii 次操作加入的魔咒字符。

输出格式:
输出 n n n 行,每行一个数。第 i" role="presentation" style="position: relative;">iii 行的数表示第 i i i 次操作后 S" role="presentation" style="position: relative;">SSS 的生成魔咒数量

输入输出样例

输入样例#1:
7
1 2 3 3 3 1 2
输出样例#1:
1
3
6
9
12
17
22
说明

对于%10的数据, 1≤n≤10 1 ≤ n ≤ 10 1≤n≤10
对于%30的数据, 1≤n≤100 1 ≤ n ≤ 100 1≤n≤100
对于%60的数据, 1≤n≤100 1 ≤ n ≤ 100 1≤n≤100
对于%100的数据, 1≤n≤100000 1 ≤ n ≤ 100000 1≤n≤100000
用来表示魔咒字符的数字 x x x 满足1≤n≤109" role="presentation" style="position: relative;">1≤n≤1091≤n≤1091≤n≤10^9

分析:
显然是一道后缀自动机的模板题,每加入一个点的答案,就是新建的这个点的 len l e n len集大小。
也就是 t[now].len−t[t[now].fail].len t [ n o w ] . l e n − t [ t [ n o w ] . f a i l ] . l e n t[now].len-t[t[now].fail].len,因为这些字符的 right r i g h t right集都为 1 1 <script type="math/tex" id="MathJax-Element-1267">1</script>,而且是以当前点为结束的点。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#define LL long longconst int maxn=2e5+7;using namespace std;int n,cnt;
int a[maxn];
LL ans;struct node{int len,fail;map <int,int> son;
}t[maxn];void build_sam()
{cnt=1;int now=1,p,q,clone;for (int i=1;i<=n;i++){int c=a[i];p=now;now=++cnt;t[now].len=t[p].len+1;while (p&&(!t[p].son[c])) t[p].son[c]=now,p=t[p].fail;if (!p) t[now].fail=1;else{q=t[p].son[c];if (t[p].len+1==t[q].len) t[now].fail=q;else{clone=++cnt;t[clone]=t[q];t[clone].len=t[p].len+1;t[now].fail=t[q].fail=clone;while (p&&(t[p].son[c]==q)) t[p].son[c]=clone,p=t[p].fail;}}ans+=t[now].len-t[t[now].fail].len;printf("%lld\n",ans);}
}int main()
{scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);build_sam();
}

洛谷 P4070 [SDOI2016]生成魔咒 后缀自动机相关推荐

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

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

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

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

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

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

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

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

  5. P4070 [SDOI2016]生成魔咒

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

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

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

  7. luogu P4070 [SDOI2016]生成魔咒

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

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

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

  9. [SDOI2016]生成魔咒

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

最新文章

  1. android开发中用到的px、dp、sp
  2. 局域网共享问题解决方法!
  3. mysql自带的监控报告_MYSQL监控-自带工具Query Profiler的使用
  4. mysql语句导出数据库文件_通过Mysql命令行语句来导入、导出数据库文件
  5. 类方法与静态方法的进一步理解
  6. 使用myeclipse创建带注解的model实体类
  7. CSS3属性之background
  8. html5 indexeddb 排序,html5 – 在IndexedDB中,有没有办法进行排序复合查询?
  9. 《深入理解分布式事务》第九章 可靠消息最终一致性分布式事务原理
  10. JSP→JSTL标准标签库简介与环境搭建、JSTL助手EL表达式EL隐式对象、标签→out、set、if、多选择配合、foreach、redirect、格式化、JSTL函数标签、自定义标签、标签类架构
  11. wxpython仿写记事本
  12. Nginx 注册为 windows服务
  13. MATLAB六自由度机械臂正逆运动
  14. 摩尔庄园手游测评——爷青回or爷青毁?
  15. 阿里云服务器价格表 ECS最新价格优惠汇总
  16. git分支主干同步命令
  17. 特殊纪念日Android APP内设置黑灰色背景
  18. 三维场景注记的配置相关(学习记录)
  19. 伊豆:把豆瓣网装进口袋
  20. 海滨学院计算机基础考试题库含答案,北京交通大学海滨学院计算机基础考试卷-网络应用基础.doc...

热门文章

  1. Acronis True Image 2021(最强数据备份与恢复软件)官方正式版V2021.39184 | acronistrueimage教程
  2. 【XJTUSE计算机图形学】第二章 光栅图形学(1)
  3. 华为薪资等级结构表_2020年华为工资等级对照表
  4. 菜单点击/关注/取消关注
  5. 【Python爬虫】requests库
  6. 收集资料库 插件,生成器 等等
  7. Cortex-M处理器中断向量表
  8. 【算法竞赛】杨辉三角 | 杨辉三角与组合数的关系 | 杨辉三角的算法应用 | c++代码实现公式获取杨辉三角位置的值
  9. Non-terminating decimal expansion; no exact representable decimal res
  10. 微信小小屠龙攻略服务器,小小屠龙实用技巧攻略合集