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】3527: [Zjoi2014]力 FFT

    [参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)= ...

  2. java对象与json互转

    package com.liveyc; import java.io.StringWriter; import org.junit.Test; import com.fasterxml.jackson ...

  3. [洛谷P1823]音乐会的等待 题解(单调栈)

    [洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...

  4. 2018中国科大自主测试-B卷部分试题

    数学部分 z = e^{\frac{2i\pi}{3}}, 求z^{2018}. \sin(2x) = \frac 35, 求\frac{\tan(x+15^{\circ})}{\tan(x-15^{ ...

  5. 牛客网习题剑指offer之数值的整数次方

    分析: 要考虑到exponent为0和负数的情况. 如果base是0并且exponent是负数的时候呢?那就发生除0的情况了. AC代码: public class Solution { public ...

  6. 33、re的match和search区别?

    1.match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配:2.也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功 ...

  7. L - SOS Gym - 101775L 博弈

    题目链接:https://cn.vjudge.net/contest/274151#problem/L 题目大意:给你一个1*n的方格,两个人轮流放字母,每一次可以放"S"或者&q ...

  8. linux 查看内存和cpu占用比较多的进程

    1.可以使用一下命令查使用内存最多的10个进程        ps -aux | sort -k4nr | head -n 102. 可以使用一下命令查使用CPU最多的10个进程        ps ...

  9. [Leetcode] N-Queens 系列

    N-Queens 系列题解 题目来源: N-Queens N-Queens II N-Queens The n-queens puzzle is the problem of placing n qu ...

  10. Pandas Installation

    1. 将环境变量PATH中加入C:\python2*\Scripts 或者 C:\Program Files\Python 3.5\Scripts 2. 进入pip.exe所在的目录:C:\Progr ...