http://www.lydsy.com/JudgeOnline/problem.php?id=3238

就算是全局变量,也不要忘记,初始化(吐血)。

长得一副lca样,没想到是个树形dp(小丫头还有两幅面孔呢)。

看代码实现吧,不大容易口头解释,把加的和减的分开算就可以了,减去的通过倒着建sam(相当于建一棵后缀树),然后算每个len取的次数实现,注意树归中一些避免重复操作。

  1. /**************************************************************
  2. Problem: 3238
  3. User: 137shoebills
  4. Language: C++
  5. Result: Accepted
  6. Time:3816 ms
  7. Memory:130688 kb
  8. ****************************************************************/
  9.  
  10. #include<iostream>
  11. #include<cstdio>
  12. #include<algorithm>
  13. #include<cstring>
  14. #include<cmath>
  15. #include<map>
  16. using namespace std;
  17. const int maxn=;
  18. char ch1[maxn]={};
  19. int siz;
  20. struct nod{
  21. int sig[];
  22. int f,len;
  23. }t[maxn*];int tot=,la=;
  24. void add(int z){
  25. int x=++tot;int i=la;
  26. t[x].len=t[la].len+;
  27. for(;i&&!t[i].sig[z];i=t[i].f)
  28. t[i].sig[z]=x;
  29. if(!i)t[x].f=;
  30. else{
  31. int p=t[i].sig[z];
  32. if(t[p].len==t[i].len+)t[x].f=p;
  33. else{
  34. int y=++tot;
  35. t[y]=t[p];t[y].len=t[i].len+;
  36. t[x].f=t[p].f=y;
  37. for(;i&&t[i].sig[z]==p;i=t[i].f)
  38. t[i].sig[z]=y;
  39. }
  40. }
  41. la=x;
  42. }
  43. struct node{
  44. int y,next;
  45. }e[maxn*];int cnt=;
  46. int head[maxn*]={};
  47. long long dp[maxn*]={},sum=;
  48. void init(int x,int y){e[++cnt].y=y;e[cnt].next=head[x];head[x]=cnt;}
  49. void dfs(int x){
  50. int y;
  51. long long num=dp[x]*dp[x];
  52. for(int i=head[x];i;i=e[i].next){
  53. y=e[i].y;
  54. dfs(y);dp[x]+=dp[y];
  55. num+=dp[y]*dp[y];
  56. }
  57. sum+=(dp[x]*dp[x]-num)*t[x].len;
  58. }
  59. long long solve(){
  60. int j=;
  61. for(int i=siz;i>=;i--){
  62. j=t[j].sig[ch1[i]-'a'];
  63. dp[j]++;
  64. }
  65. for(int i=;i<=tot;i++)
  66. init(t[i].f,i);
  67. dfs();
  68. return sum;
  69. }
  70. int main(){
  71. memset(t,,sizeof(t));
  72. scanf("%s",ch1+);siz=strlen(ch1+);
  73. for(int i=siz;i>=;i--)add((int)(ch1[i]-'a'));
  74. long long ans=;
  75. for(int i=;i<=siz;i++)ans+=(long long)i*(siz-);
  76. printf("%lld\n",ans-solve());
  77. return ;
  78. }

BZOJ 3238: [Ahoi2013]差异 后缀自动机 树形dp的更多相关文章

  1. BZOJ.3238.[AHOI2013]差异(后缀自动机 树形DP/后缀数组 单调栈)

    题目链接 \(Description\) \(Solution\) len(Ti)+len(Tj)可以直接算出来,每个小于n的长度会被计算n-1次. \[\sum_{i=1}^n\sum_{j=i+1 ...

  2. 【BZOJ 3238】差异 后缀自动机+树形DP

    题意 给定字符串,令$s_i$表示第$i$位开始的后缀,求$\sum_{1\le i < j \le n} len(s_i)+len(s_j)-2\times lcp(s_i,s_j)$ 先考虑 ...

  3. BZOJ 3238: [Ahoi2013]差异 [后缀自动机]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2512  Solved: 1140[Submit][Status ...

  4. BZOJ 3238 [Ahoi2013]差异 ——后缀自动机

    后缀自动机的parent树就是反串的后缀树. 所以只需要反向构建出后缀树,就可以乱搞了. #include <cstdio> #include <cstring> #inclu ...

  5. bzoj 3238: [Ahoi2013]差异【SAM+树形dp】

    首先只有lcp(i,j)需要考虑 因为SAM的parent树是后缀的前缀的最长公共后缀(--),所以把这个串倒过来建SAM,这样就变成了求两个前缀的最长公共后缀,长度就是这两个前缀在parent树上的 ...

  6. bzoj 3238: [Ahoi2013]差异 -- 后缀数组

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MB Description Input 一行,一个字符串S Output 一行,一个 ...

  7. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2326  Solved: 1054[Submit][Status ...

  8. bzoj 3238 Ahoi2013 差异

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2357  Solved: 1067[Submit][Status ...

  9. BZOJ 3238 [Ahoi2013]差异(后缀自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3238 [题目大意] 给出一个串,设T[i]表示从第i位开始的后缀, 求sum(len( ...

随机推荐

  1. 【BZOJ】3992: [SDOI2015]序列统计 NTT+生成函数

    [题意]给定一个[0,m-1]范围内的数字集合S,从中选择n个数字(可重复)构成序列.给定x,求序列所有数字乘积%m后为x的序列方案数%1004535809.1<=n<=10^9,3< ...

  2. 正则表达式:Python 模块 re 简介

    为了使文章更具可读性,本文将正则表达式冗长的 语法介绍 放在了文章的末尾. 一.正则表达式简介 正则表达式(RegExp)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(元字符 ...

  3. 网易android开发面试题及心得

    前几天面试网易android开发,总体感觉问题难度一般.怪我自己没有好好梳理知识,尤其是基础,后面就没消息了... 笔试: 1.描述Activity 生命周期 2.什么是ANR,如何规避? 3.描述a ...

  4. Java从零到企业级电商项目实战

    欢迎关注我的微信公众号:"Java面试通关手册"(坚持原创,分享各种Java学习资源,面试题,优质文章,以及企业级Java实战项目回复关键字免费领取)回复关键字:"电商项 ...

  5. python设计模式之常用创建模式总结(二)

    前言 设计模式的创建模式终极目标是如何使用最少量最少需要修改的代码,传递最少的参数,消耗系统最少的资源创建可用的类的实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常 ...

  6. shell 监控磁盘使用率【转】

    方案一: disks=(`df |sed 1d | awk '{print $1,$5}'|tr -d %`) len=${#disks[@]} ;i<=$len;i=i+));do ];the ...

  7. 禁用quartz自动检查更新

    禁用quartz自动检查更新的3种方法 1, <bean id="startQuertz" lazy-init="false" autowire=&quo ...

  8. yum和head一起用,报错“由于管道被破坏而退出”

    当要打印 [yum list ]时, 加上了管道符 以及 head 会出现报错 “由于管道被破坏而退出” 是因为 yum 与 head 连用 存在bug ,如果使用tail 则没有出现 具体什么bug ...

  9. Tutorial 4: Authentication & Permissions

    转载自:http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/ Tutorial 4: Auth ...

  10. 11.python3标准库--使用进程、线程和协程提供并发性

    ''' python提供了一些复杂的工具用于管理使用进程和线程的并发操作. 通过应用这些计数,使用这些模块并发地运行作业的各个部分,即便是一些相当简单的程序也可以更快的运行 subprocess提供了 ...