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

【题解】

题上所给公式可以化为

其中:

=1×(n-1)+2×(n-2)+3×(n-3)+……+(n-1)×1+2×1+3×2+……+n×(n-1)

=(n+1)+2×(n+1)+3×(n+1)+……+(n-1)(n+1)

=(1+2+3+……+(n-1))(n+1)

=n(n-1)(n+1)/2

接着考虑后面的,我们把串逆序后建成SAM,搞出后缀树,我们知道在后缀树上两个点的LCA的深度就是它们的公共字串长度

所以我们考虑树形dp,对于每一条边,它的贡献就是v[i]*C[size[x]][2]

后来膜拜了一下LZX的代码,发现我们其实不用建出后缀树,只需要搞出它的拓扑序,用子节点更新父节点的答案就行了。

比建后缀树的代码快了1s,在bzoj上排名第10,(那些用指针写的真心快啊)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
#define FILE "read"
#define MAXN 1000010
#define up(i,j,n) for(int i=j;i<=n;++i)
#define dn(i,j,n) for(int i=j;i>=n;--i)
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
//struct node{int y,next,v;}e[MAXN*2];
int n,now(1),cnt(1),len,Link[MAXN],size[MAXN],par[MAXN],c[MAXN],id[MAXN],mx[MAXN],son[MAXN][27];
ll ans;
char ch[MAXN];
/*void insert(int x,int y,int v){e[++len].next=Link[x];Link[x]=len;e[len].y=y;e[len].v=v;e[++len].next=Link[y];Link[y]=len;e[len].y=x;e[len].v=v;
}*/
void extend(int x){int p=now,np=++cnt;mx[np]=mx[now]+1; now=np;  size[np]=1;while(!son[p][x]&&p)  son[p][x]=np,p=par[p];if(!p)  par[np]=1;else{int q=son[p][x];if(mx[q]==mx[p]+1)  par[np]=q;else{int nq=++cnt; mx[nq]=mx[p]+1;memcpy(son[nq],son[q],sizeof(son[q]));par[nq]=par[q]; par[q]=par[np]=nq;while(son[p][x]==q)  son[p][x]=nq,p=par[p];}}
}
void topsort(){up(i,1,cnt)  c[mx[i]]++;up(i,1,n)    c[i]+=c[i-1];up(i,1,cnt)  id[c[mx[i]]--]=i;
}
/*void dp(int x,int fa,int v){for(int i=Link[x];i;i=e[i].next){if(e[i].y==fa)  continue;dp(e[i].y,x,e[i].v);size[x]+=size[e[i].y];}ans-=(ll)size[x]*(size[x]-1)*v;
}*/
int main(){freopen(FILE".in","r",stdin);freopen(FILE".out","w",stdout);scanf("%s",ch+1); n=strlen(ch+1);dn(i,n,1)  extend(ch[i]-'a');//up(i,2,cnt)  insert(i,par[i],mx[i]-mx[par[i]]);ans=(ll)n*(n-1)*(n+1)/2;  //dp(1,0,0);topsort();  dn(i,cnt,2) {int x=id[i];size[par[x]]+=size[x];ans-=(ll)(mx[x]-mx[par[x]])*(size[x]-1)*size[x];}printf("%lld\n",ans);return 0;
}

【bzoj3238】差异 后缀自动机相关推荐

  1. bzoj3238 [Ahoi2013]差异 后缀自动机

    这个题虽然看起来比较麻烦,但其实有一点搞懂了就好做了 每一个后缀的前缀的lcp一定是这个串里的子串, 对于全部子串,如果它不是后缀,那一定可以找到这个串对应的后缀, 而这样的子串和后缀子串是没有区别的 ...

  2. bzoj3238 [Ahoi2013]差异 后缀自动机

    题意:给出一个串,求其中任意两个字串的lcp的总和. 我们可以对于这个串建一颗后缀自动机,实际上,他的parent边树就是一颗后缀树,我们在后缀树上统计答案,设f表示right集合的大小,可以理解为后 ...

  3. bzoj3238 [ AHOI2013 ] --后缀自动机

    显然只需求LCP(i,j)就可以了. 将s反转,然后插入后缀自动机.由于后缀自动机的link指针构成了一棵后缀树,而字符串又反转过,所以两个结点的LCP就是LCA. 树形DP,求出以每个结点为LCA的 ...

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

    题目 一个长度为n的字符串S,令TiT_i表示它从第i个字符开始的后缀.求 ∑1≤i<j≤nlen(Ti)+len(Tj)−2∗lcp(Ti,Tj) \sum_{1\le i 其中len(a)表 ...

  5. [BZOJ3238] [AHOI2013] 差异 - 后缀自动机

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1968  Solved: 896 [Submit][Statu ...

  6. bzoj3238: [Ahoi2013]差异(后缀自动机)

    传送门 后缀自动机好题. 题意: 做法:samsamsam 废话 考虑翻转字串,这样后缀的最长公共前缀等于前缀的最长公共后缀. 然后想到parentparentparent树上面两个串的最长公共后缀跟 ...

  7. BZOJ_3238_[Ahoi2013]差异_后缀自动机

    BZOJ_3238_[Ahoi2013]差异_后缀自动机 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sam ...

  8. [BZOJ3238][AHOI2013]差异 [后缀数组+单调栈]

    题目地址 - GO-> 题目大意: 给定一个长度为 nn 的字符串SS,令TiTi表示它从第ii个字符开始的后缀,求以下这个式子的值: ∑1≤i<j≤nlen(Ti)+len(Tj)−2× ...

  9. BZOJ3238 后缀自动机+推公式

    拿到题目第一步就把前面的len(Ti)+len(Tj)手算出来了 可以知道这个答案只和n有关系 为n*(n+1)*(n-1)/2 (如果不会手算On跑出来也行 问题不大) 后面求LCP就是重点了 通常 ...

最新文章

  1. 深入redis内部--初始化服务器
  2. 【转】四元数的推导过程
  3. 废芯片做出来的艺术品!值得一看!
  4. Debug method
  5. 发送http和https请求工具类 Json封装数据
  6. python表白代码-python浪漫表白源码
  7. proxmoxve打造云桌面_最大亮点!山东众志电子为山东财经大学东方学院打造首个200点位云桌面考场...
  8. 喜庆:上周阅读量5W,超过了99%的C友
  9. OKR案例: 回顾/复盘会流程模板
  10. TextRank算法学习笔记
  11. 深圳多九云优认知能力团体反馈训练系统----认知训练与生物反馈训练合二为一
  12. vtkPolyData获取bounds点坐标
  13. 【Java设计模式】责任链模式
  14. 巧用剪贴蒙版制作西瓜图标
  15. 【C语言】结构体-求出学生的平均成绩放在成员ave中
  16. supplier java8_Java 8之 Supplier示例
  17. 单系统 台电x80pro_转载:台电X80 Pro Plus 刷Windows10单系统
  18. 淘宝电影成全国最大在线选座平台 覆盖702家影院
  19. 查新检索报告哪里出?
  20. WebGL的3D家居创意设计踩坑手记

热门文章

  1. MySQL数据库:SQL执行顺序
  2. 折半查找判定树 二叉排序树 查找成功平均查找长度 查找失败平均查找长度
  3. 烟台大学CSDN俱乐部参加2012移动开发者大会见闻
  4. 计算机word.实训报告体会,计算机实训报告【五篇】.docx
  5. 人工智能专业主要学习哪些课程,目前的就业方向是什么?
  6. 【硬见小百科】一些硬件电路技术经验整理
  7. 零碎知识点之二:循环平稳信号
  8. 递归函数——上台阶问题
  9. 应软”治理大学生上课玩手机现象
  10. Field ‘browser‘ doesn‘t contain a valid alias configuration