bzoj3238--后缀自动机
显然只需求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--后缀自动机的更多相关文章
- 【BZOJ3238】差异(后缀自动机)
[BZOJ3238]差异(后缀自动机) 题面 BZOJ 题解 前面的东西直接暴力算就行了 其实没必要算的正正好 为了方便的后面的计算 我们不考虑\(i,j\)的顺序问题 也就是先求出\(\sum_{i ...
- BZOJ3238: [Ahoi2013]差异 (后缀自动机)
Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 HINT 2<=N< ...
- 2018.12.21 bzoj3238: [Ahoi2013]差异(后缀自动机)
传送门 后缀自动机好题. 题意: 做法:samsamsam 废话 考虑翻转字串,这样后缀的最长公共前缀等于前缀的最长公共后缀. 然后想到parentparentparent树上面两个串的最长公共后缀跟 ...
- 【BZOJ3238】差异【后缀自动机+dp】
题意 分析 这个题目还是很优秀的.sigma(len(Ti)+len(Tj))的值是一定的=n*(n+1)*(n-1)/2.那么关键就是求任意两个后缀的lcp的和了. 我们怎么求两个后缀的lcp?如果 ...
- [bzoj3238][Ahoi2013]差异——后缀自动机
Brief Description Algorithm Design 下面给出后缀自动机的一个性质: 两个子串的最长公共后缀,位于这两个串对应的状态在parent树上的lca状态上.并且最长公共后缀的 ...
- 【算法】后缀自动机(SAM) 例题
算法介绍见:http://www.cnblogs.com/Sakits/p/8232402.html 广义SAM资料:https://www.cnblogs.com/phile/p/4511571.h ...
- bzoj3879 SvT(后缀自动机+虚树)
bzoj3879 SvT(后缀自动机+虚树) bzoj 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始位置 ...
- BZOJ 后缀自动机四·重复旋律7
后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...
- 【Codeforces235C】Cyclical Quest 后缀自动机
C. Cyclical Quest time limit per test:3 seconds memory limit per test:512 megabytes input:standard i ...
- 【hihocoder#1413】Rikka with String 后缀自动机 + 差分
搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...
随机推荐
- 深入了解Bundle和Map
[转]http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0402/2684.html 前言 因为往Bundle对象中放入Map实际上 ...
- ECSHOP中ajax的调用原理
ECSHOP中ajax的调用原理 ecshop中ajax的调用原理. 1.首先ecshop是如何定义ajax对象的. ecshop中的ajax对象是在js/transport.js文件中定义的.里面是 ...
- Spring与Struts框架整合
Spring与Struts框架整合 Struts,用Action处理请求 Hibernate,操作数据库 Spring,负责对象创建 Spring与Struts框架整合的关键点在与:让Struts框架 ...
- Android控件上添加图片
项目中有一个点赞功能,点赞的小图标添加在点赞列表旁边,在xml里可以进行设置,也可以在代码中进行绘图. 下面是两种方法的设置: 1.xml里:一些控件:button.textView等等里面有个属性是 ...
- Struts2接受参数的几种类型和接受复杂类型参数(list<String>和list<Object>)
Struts2接受参数的几种类型 大概有这几种类型: 1.使用Action的属性接受参数 在Action中加入成员变量,配置Getter和Setter方法,Getter而和Setter方法的名字和表单 ...
- Python使用Selenium/PhantomJS
安装selenium: 1 pip install selenium 安装PhantomJS: 1 2 3 4 https://bitbucket.org/ariya/phantomjs/downlo ...
- Dictionary使用(转)
1.要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib)2.描述 1).从一组键(Key)到一组值(Value)的 ...
- [oracle]Oracle角色管理
假如我们直接给每一个用户赋予权限,这将是一个巨大又麻烦的工作,同时也不方便DBA进行管理.通过采用角色,使得: 权限管理更方便.将角色赋予多个用户,实现不同用户相同的授权.如果要修改这些用户的权限,只 ...
- Java 之 Spring加载(Java之负基础实战)
1.下载后解压 2.在WEB-INF里面创建lib文件夹 3.拖入jar包 只拖入*.RELEASE.jar包
- 让div显示在屏幕中央的css代码段
.popup{ width:500px; height:400px; position:absolute; top:50%; left:50%; margin-top:-200px; /*注意 ...