题目链接

后缀数组做法见这。

直接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)相关推荐

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

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

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

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

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

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

  4. BZOJ 4516 [Sdoi2016] 生成魔咒

    传送门 心态崩了++ 后缀自动机板子题[考场上要是不会后缀自动机就崩了T^T] 可以看出 每次答案的贡献就是和原来本质不同的子串数量 根据SPOJ7258我们可以得到 本质不同的子串数量可以通过建出自 ...

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

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

  6. [SDOI2016]生成魔咒

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

  7. BZOJ4516: [Sdoi2016]生成魔咒

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

  8. P4070 [SDOI2016]生成魔咒

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

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

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

最新文章

  1. svn command line tag
  2. synergy共享ubuntu和windows键鼠
  3. Django 的操作
  4. iOS8 【xcode6中添加pch全局引用文件】
  5. Fiddler之为什么我没有抓到网络请求的js链接
  6. Eclipse扩展的轻量级集成测试
  7. redis windows安装
  8. Windows安装WSL进行机器学习(windows和Ubuntu同时使用)
  9. 星际争霸战略战术的发展和创新
  10. linux之sed用法-转
  11. thinking_in_java_version_1
  12. 计算机管理找不到新安装的系统,我的电脑开机显示找不到启动设备,请在硬盘上安装操作系统怎么办?开...
  13. 用python输出沙漏_sandglass(沙漏)——一个让人解脱的python时间处理库
  14. 驼峰命名法与下划线命名法之争
  15. 幻方、九坤、灵均集体发声:已与监管建立信息同步机制
  16. java中date获取前一天和后一天
  17. 北京林业大学计算机保研,北京林业大学2021年各专业保研数据详细分析
  18. 计算机开机怎样进入cmos,在电脑启动过程中进入CMOS
  19. OA系统,企业信息化建设的“理想”办公管理工具
  20. 沪深A股指数列表数据API接口(JSON标准格式,Get请求方式)

热门文章

  1. node服务的监控预警系统架构
  2. Java与JavaScript的通信
  3. python标签使用教程_怎样用Python做标签云
  4. 任意门怎么用团发_平开门、推拉门都out了!衣柜门这样设计,实用方便又大气!...
  5. zendguard php5.4,ZendGuardLoader6.0.0支持PHP5.4.x系列
  6. Visual C++利用互斥量同步线程实现文件读取进度条
  7. gRPC Web使用指南
  8. CSDN光合计划-纯干货-推荐几个python全系列学习教程
  9. Oracle修改密码文件_转载:Oracle修改用户密码
  10. java虚拟机_Oracle独家:Java虚拟机学习指南