Description

Input

一行,一个字符串S

Output

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

Sample Input

cacao

Sample Output

54

HINT

2<=N<=500000,S由小写英文字母组成

Solution

后缀自动机的fa指针反向以后可以形成一个树结构,称作Parent树
一个节点的father是他的最长后缀,那么很显然任意两个子串的最长公共后缀位于它们Parent树对应节点的lca处
为了利用这个性质,可以把串反过来建立SAM,问题转化成对这个串的所有前缀求最长公共后缀
要注意只有np节点才能代表前缀
一对对枚举前缀求lcs显然是不可能的,可以考虑对于每个子串,它是多少对前缀的最长公共后缀
也就是对于每个节点,求它是多少对前缀节点的LCA
然后DFS一下就好了

Code

 #include<iostream>
#include<cstring>
#include<cstdio>
#define N (1000000+1000)
using namespace std; struct Edge{int to,next;}edge[N<<];
long long ans;
int head[N],num_edge;
char s[N]; void add(int u,int v)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
head[u]=num_edge;
} struct SAM
{
int fa[N],son[N][],right[N],step[N],od[N],wt[N],size[N];
int p,q,np,nq,last,cnt;
SAM(){last=++cnt;} void Insert(int x)
{
p=last; last=np=++cnt; step[np]=step[p]+; size[np]=;
while (p && !son[p][x]) son[p][x]=np,p=fa[p];
if (!p) fa[np]=;
else
{
q=son[p][x];
if (step[p]+==step[q]) fa[np]=q;
else
{
nq=++cnt; step[nq]=step[p]+;
memcpy(son[nq],son[q],sizeof(son[q]));
fa[nq]=fa[q]; fa[q]=fa[np]=nq;
while (son[p][x]==q) son[p][x]=nq,p=fa[p];
}
}
}
void Dfs(int x,int fa)
{
long long sum=,is_one=(size[x]==);
for (int i=head[x]; i; i=edge[i].next)
if (edge[i].to!=fa)
{
Dfs(edge[i].to,x);
size[x]+=size[edge[i].to];
ans-=*sum*size[edge[i].to]*step[x];
sum+=size[edge[i].to];
}
if (is_one) ans-=2ll*(size[x]-)*step[x];
}
}SAM; int main()
{
scanf("%s",s);
long long len=strlen(s);
ans=(len-)*len/*(len+);
for (int i=len-; i>=; --i)
SAM.Insert(s[i]-'a');
for (int i=; i<=SAM.cnt; ++i)
add(i,SAM.fa[i]),add(SAM.fa[i],i);
SAM.Dfs(,-);
printf("%lld",ans);
}

BZOJ3238:[AHOI2013]差异(SAM)的更多相关文章

  1. BZOJ3238 [Ahoi2013]差异 【SAM or SA】

    BZOJ3238 [Ahoi2013]差异 给定一个串,问其任意两个后缀的最长公共前缀长度的和 1.又是后缀,又是\(lcp\),很显然直接拿\(SA\)的\(height\)数组搞就好了,配合一下单 ...

  2. bzoj3238 [Ahoi2013]差异 后缀数组+单调栈

    [bzoj3238][Ahoi2013]差异 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Ou ...

  3. [bzoj3238][Ahoi2013]差异_后缀数组_单调栈

    差异 bzoj-3238 Ahoi-2013 题目大意:求任意两个后缀之间的$LCP$的和. 注释:$1\le length \le 5\cdot 10^5$. 想法: 两个后缀之间的$LCP$和显然 ...

  4. luogu P4248 [AHOI2013]差异 SAM

    luogu P4248 [AHOI2013]差异 链接 luogu 思路 \(\sum\limits_{1<=i<j<=n}{{len}(T_i)+{len}(T_j)-2*{lcp ...

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

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

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

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

  7. [BZOJ3238][AHOI2013]差异(后缀数组)

    求和式的前两项可以直接算,问题是对于每对i,j计算LCP. 一个比较显然的性质是,LCP(i,j)是h[rk[i]+1~rk[j]]中的最小值. 从h的每个元素角度考虑,就是对每个h计算有多少对i,j ...

  8. [BZOJ3238][Ahoi2013]差异解题报告|后缀数组

    Description 先分析一下题目,我们显然可以直接算出sigma(len[Ti]+len[Tj])的值=(n-1)*n*(n+1)/2 接着就要去算这个字符串中所有后缀的两两最长公共前缀总和 首 ...

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

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

随机推荐

  1. MySQL之函数

    了解编程的人一般都会知道函数的重要性,丰富的函数有的时候可以给我们带来事半功倍的效果,在MySQL中提供了许多的内置函数,能够帮助开发人员编写简单快捷的SQL语句,除了这些内置的函数之外,用户也可以自 ...

  2. Config 代码片段

    class Config { private static Config _instance = null; public static Config Instance { get { if (_in ...

  3. iCheck

    iCheck改变 checkbox.radio的样式,原生或用bootstrap的都太丑. 简单用法:引用 <link rel="stylesheet" type=" ...

  4. Web后台模拟前端post(带NTLM验证)

    using System.Data; using System.Net; using System.IO; using System.Net.Http; using System.Web; using ...

  5. List和Queue使用过程中的纪录

    业务需求: 发送特定的请求,根据返回的信息执行特定的事件. 目前的做法:把我的请求放入一个容器内,然后待到某一条件,就从这个容器把请求发送出去,等客户返回信息时,查询容器中对应请求中特定的事件.开始的 ...

  6. Python基础学习总结(二)

    2.列表简介 Python有内置的一种数据类型列表:list. list是一种有序的集合. 列表由一系列按特定顺序排列的元素组合.用方括号 [ ] 来表示. list里面的元素的数据类型可以不同,比如 ...

  7. Spring Data JPA 缓存结合Ehcache介绍

    一级缓存: 会话session.事务级别的,事务退出,缓存就失效了. 实体管理器在事务执行期间持有一份数据的拷贝,而非直接操作数据源. 二级缓存: 进程范围级或集群范围的缓存,这个级别的缓存可配置和修 ...

  8. lib 和 dll

    dll 和 lib只有在windows平台才会出现,老是忘记他们的区别和联系,记录一下,以备不时之需,也加深一下印象.  在弄懂两者的区别之前,需要知道两个概念: static library 和 d ...

  9. MobileWeb 适配总结

    开门见山,本篇将总结一下 MobileWeb 的适配方法,即我们常说的H5页面.手机页面.WAP页.webview页面等等. 本篇讨论的页面指专门针对手机设备设计的页面,并非兼容全设备的响应式布局. ...

  10. JavaScript 二维数组排列组合

    <html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...