【SDOI2016】生成魔咒
Description
魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 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 共有多少种生成魔咒。
Solution
后缀自动机做又短又快
后缀自动机学习小记
每一次 ans+=t[np].len−t[t[np].fa].len ans+=t[np].len-t[t[np].fa].len就可以了。
直接减trie空间不行
c++有一个map,简单的代替trie的数组。
不然,可以hash然后建邻接表。
Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cmath>
#include<map>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=100007;
int i,j,k,l,n,m,last,num,yi,er;
long long ans;
struct node{int len,fa;
}t[maxn*2];
map<int,int>son[maxn*2];
int np,nq,p,q;
void extend(int c){p=last,np=++num;t[np].len=t[p].len+1;while(p&&!son[p][c])son[p][c]=np,p=t[p].fa;if(!p)t[np].fa=1;else{q=son[p][c];if(t[q].len==t[p].len+1)t[np].fa=q;else{nq=++num;for(map<int,int>::iterator i=son[q].begin();i!=son[q].end();i++){son[nq][i->first]=i->second; }t[nq]=t[q];t[nq].len=t[p].len+1;t[q].fa=t[np].fa=nq;while(p&&son[p][c]==q)son[p][c]=nq,p=t[p].fa;}}last=np;
}
int main(){freopen("incantation.in","r",stdin);freopen("incantation.out","w",stdout);scanf("%d",&n);last=num=1;fo(i,1,n){scanf("%d",&k);extend(k);ans+=t[np].len-t[t[np].fa].len;printf("%lld\n",ans);}
}
【SDOI2016】生成魔咒相关推荐
- [SDOI2016]生成魔咒
4516: [Sdoi2016]生成魔咒 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1460 Solved: 835 [Submit][Sta ...
- BZOJ4516: [Sdoi2016]生成魔咒
BZOJ4516: [Sdoi2016]生成魔咒 Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示. 例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒 ...
- BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
4516: [Sdoi2016]生成魔咒 题意:询问一个字符串每个前缀有多少不同的子串 做了一下SDOI2016R1D2,题好水啊随便AK 强行开map上SAM 每个状态的贡献就是\(Max(s)-M ...
- P4070 [SDOI2016]生成魔咒
P4070 [SDOI2016]生成魔咒 题意: 有n个字符xi,每次在S的末尾加入一个字符,(一开始S为空),每次加入xi后的不相同字串有多少个 题解: 做这个题首先要会后缀数组P3809 [模板] ...
- 洛谷 P4070 [SDOI2016]生成魔咒 解题报告
P4070 [SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 \(1\).\(2\) 拼凑起来形成一个魔咒串 \([1,2]\). 一个魔咒 ...
- P4070 [SDOI2016]生成魔咒(SAM len数组的含义)
[SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 , 2 1,2 1,2 拼凑起来形成一个魔咒串 [ 1 , 2 ] [1,2] [1, ...
- bzoj4516 / P4070 [SDOI2016]生成魔咒
P4070 [SDOI2016]生成魔咒 后缀自动机 每插入一个字符,对答案的贡献为$len[last]-len[fa[last]]$ 插入字符范围过大,所以使用$map$存储. (去掉第35行就是裸 ...
- 【刷题】BZOJ 4516 [Sdoi2016]生成魔咒
Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例 ...
- [SDOI2016] 生成魔咒(后缀数组SA + st表 + set)动态不同子串个数
problem luogu-P4070 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1,21,21,2 拼凑起来形成一个魔咒串 [1,2][1,2][1,2]. 一个魔咒串 ...
- 洛谷 P4070 [SDOI2016]生成魔咒 后缀自动机
题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1, ...
最新文章
- 太火!这本AI图书微软强推,程序员靠它拿下50K!
- button/input链接方式全攻略 [转]
- java多图片上传json_SpringMVC框架五:图片上传与JSON交互
- flex布局应用与踩坑
- OpenGL编程指南-理解入门笔记
- oracle imp仅导入数据
- 可以打印快递电子面单的表格
- 仙侠手游服务器搭建。
- 数字电子技术-逻辑门电路
- 大学生计算机水平怎么提高,大学生如何提高计算机能力
- nginx网关与gateway网关的区别
- win10无法装载重装系统iso文件_win10镜像不能安装系统如何解决_win10镜像无法安装处理方法...
- API MISUSE: Cancelling connection for unused peripheral
- 插屏广告怎么玩?这些优化要点请get~
- pointnet语义分割_训练并预测自己的数据
- Mysql:外码约束
- 腾讯网页登陆的加密机制
- 基于jsp+mysql+Spring+SpringMVC+mybatis的ssm生鲜超市进销存管理系统
- memcached 注册服务器,Memcached深入剖析(一)—Memcached服务器安装
- canvas实现走势图实现