传送门

心态崩了++

后缀自动机板子题[考场上要是不会后缀自动机就崩了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] 生成魔咒相关推荐

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

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

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

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

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

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

  4. [SDOI2016]生成魔咒

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

  5. BZOJ4516: [Sdoi2016]生成魔咒

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

  6. P4070 [SDOI2016]生成魔咒

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

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

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

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

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

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

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

最新文章

  1. php网课资源百度云盘_安全中国PHP网站开发工程师就业指导班 35课 附课件、源码,全套视频教程学习资料通过百度云网盘下载...
  2. 美国国防部将把人工智能用于空战
  3. 史上最全的Web性能测试工具大全(下 )
  4. python异常处理--try except else raise finally
  5. Matlab并行编程方法
  6. 【数据结构与算法】之深入解析运用链表结构计算“两数相加”的算法实现
  7. openssh升级_Redhat 6.5源码编译升级openssh到7.8版本
  8. Oracle在Linux平台安装时涉及的/etc/security/limits.conf
  9. Spark Scala当中reduceByKey的用法
  10. 使用jsp页面查看jvm使用情况
  11. HDU1106 排序【字符串+整数+排序】
  12. NGUI 3.5课程(五岁以下儿童)button-图片切换
  13. Qweb Pdf 中添加 图片
  14. html空心字体怎么设置,Word或者WPS如何设置阴影空心的特大字体?
  15. 关于开发板不断eth0: link up, 100Mbps, full-duplex, lpa 0x45E1 eth0: link down的问题
  16. 多人联机的俄罗斯方块游戏(C++),游戏规则模仿任天堂Tetris99,基于qt,kcp,protobuf,qslog。
  17. 计算机组成原理课程设计报告 给出指令执行流程 add(二进制加法),计算机组成原理课程设计...
  18. 安卓APP源码和设计报告——智能垃圾桶
  19. 嵌入式系统主要应用于哪些行业中?
  20. Rails中的includes和joins的区别与用法(翻译,部分)

热门文章

  1. facenet 中心损失函数(center loss)详解(代码分析)含tf.gather() 和 tf.scatter_sub()函数
  2. gimp教程:gimp界面介绍
  3. python在for循环中不能删除正在循环的列表(问题已解决)
  4. 8086标志寄存器介绍及作用(未完)
  5. php获取python的变量,PHPPython变量交换
  6. ftpClient的连接超时设置(setConnectTimeout,setSoTimeout)
  7. java NIO 文章
  8. 阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义
  9. python 基础(十)
  10. java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextAware