显然只需求LCP(i,j)就可以了。

将s反转,然后插入后缀自动机。由于后缀自动机的link指针构成了一棵后缀树,而字符串又反转过,所以两个结点的LCP就是LCA。

树形DP,求出以每个结点为LCA的个数就可以了。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 500001
#define ll long long
ll f[N<<],k,Ans;
int i,j,n,m,Link[N<<],Len[N<<],Last,Cur,Num,Next[N<<][],Sum[N<<],g[N<<],b[N],r[N<<],x;
char s[N];
inline void Insert(int x){
Cur=++Num;Len[Cur]=Len[Last]+;f[Cur]=g[Cur]=;
int p;
for(p=Last;p&&!Next[p][x];p=Link[p])Next[p][x]=Cur;
if(!p)Link[Cur]=;else{
int q=Next[p][x];
if(Len[p]+==Len[q])Link[Cur]=q;else{
int C=++Num;Len[C]=Len[p]+;
Link[C]=Link[q];memcpy(Next[C],Next[q],sizeof(Next[q]));
for(;p&&Next[p][x]==q;p=Link[p])Next[p][x]=C;
Link[q]=Link[Cur]=C;
}
}Last=Cur;
}
int main()
{
scanf("%s",&s);
n=strlen(s);Last=Num=;
for(i=n-;i>=;i--)Insert(s[i]-'a');
for(i=;i<=Num;i++)b[Len[i]]++;
for(i=;i<=n;i++)b[i]+=b[i-];
for(i=;i<=Num;i++)r[b[Len[i]]--]=i;
for(i=Num;i;i--)f[Link[r[i]]]+=f[r[i]];
for(i=;i<=Num;i++){
x=r[i];
Ans+=1ll*g[Link[x]]*f[x]*Len[Link[x]];
g[Link[x]]+=f[x];
}
printf("%lld",(1ll*n*(n-)*(n+)>>)-(Ans<<));
return ;
}

bzoj3238

bzoj3238--后缀自动机的更多相关文章

  1. 【BZOJ3238】差异(后缀自动机)

    [BZOJ3238]差异(后缀自动机) 题面 BZOJ 题解 前面的东西直接暴力算就行了 其实没必要算的正正好 为了方便的后面的计算 我们不考虑\(i,j\)的顺序问题 也就是先求出\(\sum_{i ...

  2. BZOJ3238: [Ahoi2013]差异 (后缀自动机)

    Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 HINT 2<=N< ...

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

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

  4. 【BZOJ3238】差异【后缀自动机+dp】

    题意 分析 这个题目还是很优秀的.sigma(len(Ti)+len(Tj))的值是一定的=n*(n+1)*(n-1)/2.那么关键就是求任意两个后缀的lcp的和了. 我们怎么求两个后缀的lcp?如果 ...

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

    Brief Description Algorithm Design 下面给出后缀自动机的一个性质: 两个子串的最长公共后缀,位于这两个串对应的状态在parent树上的lca状态上.并且最长公共后缀的 ...

  6. 【算法】后缀自动机(SAM) 例题

    算法介绍见:http://www.cnblogs.com/Sakits/p/8232402.html 广义SAM资料:https://www.cnblogs.com/phile/p/4511571.h ...

  7. bzoj3879 SvT(后缀自动机+虚树)

    bzoj3879 SvT(后缀自动机+虚树) bzoj 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始位置 ...

  8. BZOJ 后缀自动机四·重复旋律7

    后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...

  9. 【Codeforces235C】Cyclical Quest 后缀自动机

    C. Cyclical Quest time limit per test:3 seconds memory limit per test:512 megabytes input:standard i ...

  10. 【hihocoder#1413】Rikka with String 后缀自动机 + 差分

    搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...

随机推荐

  1. storybody中页面跳转

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if ([segue.destinationViewCont ...

  2. iOS开发——自定义AlertView

    自定义的AlertView,可以选择出现的动画方式,正文信息高度自动变化,特意做了几个可以对比.没啥难点,直接上代码,一看就懂. 1.在YYTAlertView.h文件中 // //  YYTAler ...

  3. 结合实际项目分析pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. vuejs 子组件传递父组件的第二种方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 3)Javascript设计模式:Observer模式

    Observer模式 var Observer = (function() { var instance = null; function Observe() { this.events = {} } ...

  6. java设计模式笔记(1)-适配器模式

    适配器的定义 适配器就是一个接口转换器,它可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口.比如:电源适配器.三角架基座转接部件.USB与串口的转接设备等. ...

  7. Python twisted article

    学习python twisted 的好文章 An Introduction to Asynchronous Programming and Twisted Reference: http://kron ...

  8. linux 安装jdk及tomcat指定jdk版本推荐

    方法1:用yum命令安装 1.   查看当前jdk版本:Java –version,或者是:rpm -qa | grep jdk 2.   删除当前jdk:yum -y remove java-1.6 ...

  9. 详解Grunt插件之LiveReload实现页面自动刷新(两种方案)

    http://www.jb51.net/article/70415.htm    含Grunt系列教程 这篇文章主要通过两种方案详解Grunt插件之LiveReload实现页面自动刷新,需要的朋友可以 ...

  10. centos 6 下编译安装 nginx

    下载nginx源码包,可以到nginx官方的下载文件归档里 http://nginx.org/download/ 下载 下载pcre源码,并编译安装,从pcre官方下载  ftp://ftp.csx. ...