BZOJ.4516.[SDOI2016]生成魔咒(后缀自动机 map)
题目链接
后缀数组做法见这。
直接SAM+map。对于每个节点其产生的不同子串数为len[i]-len[fa[i]]。
//15932kb 676ms
#include <map>
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 1500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=2e5+5;char IN[MAXIN],*SS=IN,*TT=IN;
struct Suffix_Automaton
{int tot,las,fa[N],len[N];long long ans;std::map<int,int> son[N];void Insert(int c){int np=++tot,p=las; len[las=np]=len[p]+1;for(; p&&!son[p][c]; p=fa[p]) son[p][c]=np;if(!p) fa[np]=1;else{int q=son[p][c];if(len[q]==len[p]+1) fa[np]=q;else{int nq=++tot;len[nq]=len[p]+1, son[nq]=son[q];fa[nq]=fa[q], fa[q]=fa[np]=nq;for(; son[p][c]==q; p=fa[p]) son[p][c]=nq;}}printf("%lld\n",ans+=(long long)(len[np]-len[fa[np]]));}
}sam;inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}int main()
{int n=read(); sam.las=sam.tot=1;for(int i=1; i<=n; ++i) sam.Insert(read());return 0;
}
转载于:https://www.cnblogs.com/SovietPower/p/9241663.html
BZOJ.4516.[SDOI2016]生成魔咒(后缀自动机 map)相关推荐
- BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
4516: [Sdoi2016]生成魔咒 题意:询问一个字符串每个前缀有多少不同的子串 做了一下SDOI2016R1D2,题好水啊随便AK 强行开map上SAM 每个状态的贡献就是\(Max(s)-M ...
- 洛谷 P4070 [SDOI2016]生成魔咒 后缀自动机
题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1, ...
- 【刷题】BZOJ 4516 [Sdoi2016]生成魔咒
Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例 ...
- BZOJ 4516 [Sdoi2016] 生成魔咒
传送门 心态崩了++ 后缀自动机板子题[考场上要是不会后缀自动机就崩了T^T] 可以看出 每次答案的贡献就是和原来本质不同的子串数量 根据SPOJ7258我们可以得到 本质不同的子串数量可以通过建出自 ...
- bzoj4516 / P4070 [SDOI2016]生成魔咒
P4070 [SDOI2016]生成魔咒 后缀自动机 每插入一个字符,对答案的贡献为$len[last]-len[fa[last]]$ 插入字符范围过大,所以使用$map$存储. (去掉第35行就是裸 ...
- [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]. 一个魔咒 ...
- P4070 [SDOI2016]生成魔咒
P4070 [SDOI2016]生成魔咒 题意: 有n个字符xi,每次在S的末尾加入一个字符,(一开始S为空),每次加入xi后的不相同字串有多少个 题解: 做这个题首先要会后缀数组P3809 [模板] ...
- P4070 [SDOI2016]生成魔咒(SAM len数组的含义)
[SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 , 2 1,2 1,2 拼凑起来形成一个魔咒串 [ 1 , 2 ] [1,2] [1, ...
最新文章
- svn command line tag
- synergy共享ubuntu和windows键鼠
- Django 的操作
- iOS8 【xcode6中添加pch全局引用文件】
- Fiddler之为什么我没有抓到网络请求的js链接
- Eclipse扩展的轻量级集成测试
- redis windows安装
- Windows安装WSL进行机器学习(windows和Ubuntu同时使用)
- 星际争霸战略战术的发展和创新
- linux之sed用法-转
- thinking_in_java_version_1
- 计算机管理找不到新安装的系统,我的电脑开机显示找不到启动设备,请在硬盘上安装操作系统怎么办?开...
- 用python输出沙漏_sandglass(沙漏)——一个让人解脱的python时间处理库
- 驼峰命名法与下划线命名法之争
- 幻方、九坤、灵均集体发声:已与监管建立信息同步机制
- java中date获取前一天和后一天
- 北京林业大学计算机保研,北京林业大学2021年各专业保研数据详细分析
- 计算机开机怎样进入cmos,在电脑启动过程中进入CMOS
- OA系统,企业信息化建设的“理想”办公管理工具
- 沪深A股指数列表数据API接口(JSON标准格式,Get请求方式)
热门文章
- node服务的监控预警系统架构
- Java与JavaScript的通信
- python标签使用教程_怎样用Python做标签云
- 任意门怎么用团发_平开门、推拉门都out了!衣柜门这样设计,实用方便又大气!...
- zendguard php5.4,ZendGuardLoader6.0.0支持PHP5.4.x系列
- Visual C++利用互斥量同步线程实现文件读取进度条
- gRPC Web使用指南
- CSDN光合计划-纯干货-推荐几个python全系列学习教程
- Oracle修改密码文件_转载:Oracle修改用户密码
- java虚拟机_Oracle独家:Java虚拟机学习指南