BZOJ 4516 [Sdoi2016] 生成魔咒
传送门
心态崩了++
后缀自动机板子题[考场上要是不会后缀自动机就崩了T^T]
可以看出 每次答案的贡献就是和原来本质不同的子串数量
根据SPOJ7258我们可以得到 本质不同的子串数量可以通过建出自动机 树形dp解决
我们需要知道的就是 连向它的那个链
就是我们建立自动机的时候的那个找的p
直接求一下就好了
另外的理解方式就是我们要求本质不同的前缀数量 那么就是parent树上len的定义 直接len[x]-len[fa]就是答案
时间复杂度O(n)
写完了调过样例交了一发WA 然后看到STD里开longlong了改了一发longlong又一发WA 然后心态崩掉 一点一点重推 最后发现 我输出没改 还是%d [手动再见]
附代码。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#define inf 20021225
#define ll long long
#define mxn 100010
using namespace std;
struct node{int fa,len;map<int,int> ch;}t[mxn*4];
int poi,lt,rt,n;ll ans;
void insert(int c)
{int p=lt,np=lt=++poi; t[np].len=t[p].len+1;for(;p&&!t[p].ch[c];p=t[p].fa) t[p].ch[c]=np;ans+=t[np].len;if(!p){t[np].fa=rt;return;}int q=t[p].ch[c];if(t[q].len==t[p].len+1){ans-=t[q].len;t[np].fa=q;return;}int nq=++poi; t[nq].len=t[p].len+1;t[nq].ch=t[q].ch; ans-=t[nq].len;t[nq].fa=t[q].fa; t[q].fa=t[np].fa=nq;for(;p&&t[p].ch[c]==q;p=t[p].fa) t[p].ch[c]=nq;
}
int main()
{int x;scanf("%d",&n);lt=rt=++poi;for(int i=1;i<=n;i++){scanf("%d",&x);insert(x);printf("%lld\n",ans);}return 0;
}
本题还有一个非常优秀的做法就是SA
我们发现 要求本质不同的前缀数量 那么就是 len - max_lcp 我们发现 这个不就是SA的height吗!
我们可以通过倒过来删除的操作 链表维护一通 也是可以AC的~
时间复杂度是O(nlgn) 瓶颈在于求SA 如果你是大佬写DC3的话请无视
我这辈子也不可能写DC3的[Flag]
转载于:https://www.cnblogs.com/hanyuweining/p/10321915.html
BZOJ 4516 [Sdoi2016] 生成魔咒相关推荐
- BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
4516: [Sdoi2016]生成魔咒 题意:询问一个字符串每个前缀有多少不同的子串 做了一下SDOI2016R1D2,题好水啊随便AK 强行开map上SAM 每个状态的贡献就是\(Max(s)-M ...
- 【刷题】BZOJ 4516 [Sdoi2016]生成魔咒
Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例 ...
- BZOJ.4516.[SDOI2016]生成魔咒(后缀自动机 map)
题目链接 后缀数组做法见这. 直接SAM+map.对于每个节点其产生的不同子串数为len[i]-len[fa[i]]. //15932kb 676ms #include <map> #in ...
- [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]生成魔咒 解题报告
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行就是裸 ...
最新文章
- php网课资源百度云盘_安全中国PHP网站开发工程师就业指导班 35课 附课件、源码,全套视频教程学习资料通过百度云网盘下载...
- 美国国防部将把人工智能用于空战
- 史上最全的Web性能测试工具大全(下 )
- python异常处理--try except else raise finally
- Matlab并行编程方法
- 【数据结构与算法】之深入解析运用链表结构计算“两数相加”的算法实现
- openssh升级_Redhat 6.5源码编译升级openssh到7.8版本
- Oracle在Linux平台安装时涉及的/etc/security/limits.conf
- Spark Scala当中reduceByKey的用法
- 使用jsp页面查看jvm使用情况
- HDU1106 排序【字符串+整数+排序】
- NGUI 3.5课程(五岁以下儿童)button-图片切换
- Qweb Pdf 中添加 图片
- html空心字体怎么设置,Word或者WPS如何设置阴影空心的特大字体?
- 关于开发板不断eth0: link up, 100Mbps, full-duplex, lpa 0x45E1 eth0: link down的问题
- 多人联机的俄罗斯方块游戏(C++),游戏规则模仿任天堂Tetris99,基于qt,kcp,protobuf,qslog。
- 计算机组成原理课程设计报告 给出指令执行流程 add(二进制加法),计算机组成原理课程设计...
- 安卓APP源码和设计报告——智能垃圾桶
- 嵌入式系统主要应用于哪些行业中?
- Rails中的includes和joins的区别与用法(翻译,部分)
热门文章
- facenet 中心损失函数(center loss)详解(代码分析)含tf.gather() 和 tf.scatter_sub()函数
- gimp教程:gimp界面介绍
- python在for循环中不能删除正在循环的列表(问题已解决)
- 8086标志寄存器介绍及作用(未完)
- php获取python的变量,PHPPython变量交换
- ftpClient的连接超时设置(setConnectTimeout,setSoTimeout)
- java NIO 文章
- 阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义
- python 基础(十)
- java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextAware