首先只有lcp(i,j)需要考虑

因为SAM的parent树是后缀的前缀的最长公共后缀(……),所以把这个串倒过来建SAM,这样就变成了求两个前缀的最长公共后缀,长度就是这两个前缀在parent树上的lcs对应的最大长度dis

这里用treedp解决即可,就是合并一下size

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N=1000005;
  7. int n,fa[N],ch[N][27],dis[N],si[N],cur=1,con=1,la,h[N],cnt;
  8. long long ans;
  9. char s[N];
  10. struct qwe
  11. {
  12. int ne,to;
  13. }e[N<<1];
  14. void add(int u,int v)
  15. {//cerr<<u<<" "<<v<<endl;
  16. cnt++;
  17. e[cnt].ne=h[u];
  18. e[cnt].to=v;
  19. h[u]=cnt;
  20. }
  21. void ins(int c,int id)
  22. {
  23. la=cur,dis[cur=++con]=id;
  24. int p=la;
  25. for(;p&&!ch[p][c];p=fa[p])
  26. ch[p][c]=cur;
  27. if(!p)
  28. fa[cur]=1;
  29. else
  30. {
  31. int q=ch[p][c];
  32. if(dis[q]==dis[p]+1)
  33. fa[cur]=q;
  34. else
  35. {
  36. int nq=++con;
  37. dis[nq]=dis[p]+1;
  38. memcpy(ch[nq],ch[q],sizeof(ch[q]));
  39. fa[nq]=fa[q];
  40. fa[q]=fa[cur]=nq;
  41. for(;ch[p][c]==q;p=fa[p])
  42. ch[p][c]=nq;
  43. }
  44. }
  45. si[cur]=1;
  46. }
  47. void dfs(int u)
  48. {
  49. for(int i=h[u];i;i=e[i].ne)
  50. {
  51. dfs(e[i].to);
  52. ans-=2ll*dis[u]*si[u]*si[e[i].to];
  53. si[u]+=si[e[i].to];
  54. }
  55. }
  56. int main()
  57. {
  58. scanf("%s",s+1);
  59. n=strlen(s+1);
  60. reverse(s+1,s+1+n);
  61. for(int i=1;i<=n;i++)
  62. ins(s[i]-'a',i);
  63. for(int i=2;i<=con;i++)
  64. add(fa[i],i);
  65. dfs(1);
  66. for(int i=1;i<=n;i++)
  67. ans+=1ll*i*(n-1);
  68. printf("%lld\n",ans);
  69. return 0;
  70. }

bzoj 3238: [Ahoi2013]差异【SAM+树形dp】的更多相关文章

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

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

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

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

  3. bzoj 3238 Ahoi2013 差异

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

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

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

  5. BZOJ 3238: [Ahoi2013]差异 后缀自动机 树形dp

    http://www.lydsy.com/JudgeOnline/problem.php?id=3238 就算是全局变量,也不要忘记,初始化(吐血). 长得一副lca样,没想到是个树形dp(小丫头还有 ...

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

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

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

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

  8. BZOJ 3238: [Ahoi2013]差异((单调栈+后缀数组)/(后缀树))

    [传送门[(https://www.lydsy.com/JudgeOnline/problem.php?id=3238) 解题思路 首先原式可以把\(len\)那部分直接算出来,然后通过后缀数组求\( ...

  9. ●BZOJ 3238 [Ahoi2013]差异

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3238 题解: 后缀数组套路深. 问题转化为求出任意两个后缀的LCP之和 在计算贡献时,各种不 ...

随机推荐

  1. WheelView实现省市区三级联动(数据库实现版本号附带完整SQL及数据)

    近期在实现收货地址功能,用到了省市区三级联动效果,网上找到一般都是xml或json.数据源陈旧改动麻烦.改动了一下使用数据库方式实现了一下 数据源解决.因为数据量比較大通过初始化批量运行SQL的方式不 ...

  2. string方法 PadLeft 返回一个新字符串,该字符串通过在此实例中的字符左侧填充指定的 Unicode 字符来达到指定的总长度,从而使这些字符右对齐。 PadRight 右边

  3. ZOJ 3874 Permutation Graph 分治NTT

    Permutation Graph Time Limit: 2 Seconds      Memory Limit: 65536 KB Edward has a permutation {a1, a2 ...

  4. String池与iterator对集合的迭代

    一.静态导入 1.       导入类的静态属性 import static java.lang.System.out; out.println("haha"); 2.       ...

  5. android 图片内存问题

    在android开发过程中,经常遇到oom的问题,原因有很多种,其中最难处理的是图片造成的oom,于是在网络上对比了几个图片加载的库,最终选择了Facebook的fresco库(github地址:ht ...

  6. ALVtree 显示BOM结构

      REPORT  z_barry_alv_tree1_bom MESSAGE-ID oo. TABLES: stpox.INCLUDE <icon>. CLASS: cl_gui_col ...

  7. Quartz -第一篇-入门

    学习地址:https://www.imooc.com/learn/846 官网:www.quartz-scheduler.org 特点:分布式+集群 设计模式: 工厂模式 builder模式 组件模式 ...

  8. react native 中的redux 理解

    redux 中主要分为三大块,分别是Action Reducer 与Store. 1.Action是js的一个普通对象,是store数据的唯一来源.通过store.dispath()讲action传到 ...

  9. POJ3045 Cow Acrobats —— 思维证明

    题目链接:http://poj.org/problem?id=3045 Cow Acrobats Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  10. MYSQL学习拓展一:MySQL 存储过程之游标的使用!

    一.MySQL游标的概念 游标介绍: MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想, ...