3238: [Ahoi2013]差异

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 2512  Solved: 1140
[Submit][Status][Discuss]

Description

Input

一行,一个字符串S

Output

一行,一个整数,表示所求值


后缀数组看这里 http://www.cnblogs.com/candy99/p/6250732.html

反串建SAM然后Parent Tree就是后缀树了

后缀树上两点的LCP就是LCA啊

然后树形DP,没必要显示建树,直接基数排序倒推行了

状态u作为LCA的时候,就是u的不同子树v的|Right|两两相乘的和

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. using namespace std;
  7. const int N=1e6+;
  8. typedef long long ll;
  9. int n,d[N];
  10. char s[N];
  11. struct State{
  12. int ch[],par,val;
  13. }t[N];
  14. int sz,root,last;
  15. inline int nw(int _){t[++sz].val=_;return sz;}
  16. inline void iniSAM(){sz=;root=last=nw();}
  17. void extend(int c){
  18. int p=last,np=nw(t[p].val+); d[np]=;
  19. for(;p&&!t[p].ch[c];p=t[p].par) t[p].ch[c]=np;
  20. if(!p) t[np].par=root;
  21. else{
  22. int q=t[p].ch[c];
  23. if(t[q].val==t[p].val+) t[np].par=q;
  24. else{
  25. int nq=nw(t[p].val+);
  26. memcpy(t[nq].ch,t[q].ch,sizeof(t[q].ch));
  27. t[nq].par=t[q].par;
  28. t[q].par=t[np].par=nq;
  29. for(;p&&t[p].ch[c]==q;p=t[p].par) t[p].ch[c]=nq;
  30. }
  31. }
  32. last=np;
  33. }
  34.  
  35. int c[N],a[N];
  36. void RadixSort(){
  37. for(int i=;i<=sz;i++) c[t[i].val]++;
  38. for(int i=;i<=n;i++) c[i]+=c[i-];
  39. for(int i=sz;i>=;i--) a[c[t[i].val]--]=i;
  40. }
  41. ll dp(){
  42. ll _=;
  43. for(int i=sz;i>=;i--){
  44. int v=a[i],u=t[v].par;
  45. _+=(ll)t[u].val*d[u]*d[v];
  46. d[u]+=d[v];
  47. }
  48. return _;
  49. }
  50. void solve(){
  51. ll ans=(ll)n*(n+)*(n-)/;
  52. iniSAM();
  53. for(int i=;i<=n;i++) extend(s[i]-'a');
  54. RadixSort();
  55. printf("%lld",ans-*dp());
  56. }
  57. int main(int argc, const char * argv[]) {
  58. freopen("in","r",stdin);
  59. scanf("%s",s+);
  60. n=strlen(s+);
  61. reverse(s+,s++n);
  62. solve();
  63. return ;
  64. }

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

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

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

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

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

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

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

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

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

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

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

  6. 【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)$ 先考虑 ...

  7. bzoj 3238 Ahoi2013 差异

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

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

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

  9. ●BZOJ 3238 [Ahoi2013]差异

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

随机推荐

  1. 移动App,AJAX异步请求,实现简单的增、删、改、查

    用ajax发异步请求时,要注意url."AppServer"为后台项目名,"LoginServlet.action"为web.xml中的<url-patt ...

  2. 设置Sql server用户对表、视图、存储过程、架构的增删改查权限

    根据数据库Schema限制用户对数据库的操作行为 授予Shema dbo下对象的定义权限给某个用户(也就是说该用户可以修改架构dbo下所有表/视图/存储过程/函数的结构) use [Your DB N ...

  3. 修改nopCommerce中的实体

                               对已有实体增加一个属性(对Category增加一个SomeNewProperty)   最近在研究nopcommerce,这里是对官网上文档的学习 ...

  4. tp5命名空间

  5. sublime 中HTML快捷键

  6. VisualSVN Server的配置和使用方法

    VisualSVN Server是免费的,而VisualSVN是收费的.VisualSVN是SVN的客户端,和Visual Studio集成在一起, VisualSvn Server是SVN的服务器端 ...

  7. base64是啥原理

    Base64是一种基于64个可打印字符来表示二进制数据的表示方法.由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符.三个字节有24个比特,对应于4个Base64单元,即3个字节可表 ...

  8. dede的pagelist标签的listsize数字属性详解

    转载▼http://blog.sina.com.cn/s/blog_a4f3bd4e01012c8n.html dede的pagelist标签的listsize数字属性详解.见远seo经常用织梦搭建各 ...

  9. JSP页面中的pageEncoding和contentType的区别

    <%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> pag ...

  10. 开地址哈希表(Hash Table)的原理描述与冲突解决

    在开地址哈希表中,元素存放在表本身中.这对于某些依赖固定大小表的应用来说非常有用.因为不像链式哈希表在每个槽位上有一个"桶"来存储冲突的元素,所以开地址哈希表需要通过另一种方法来解 ...