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 ...
随机推荐
- Unity3D中的函数方法及解释
一.刷新函数 Update 当MonoBehaviour启用时,其Update在每一帧被调用. LateUpdate 当Behaviour启用时,其LateUpdate在每一帧被调用. FixedUp ...
- Mac下安装包管理平台Homebrew(Mac 10.12)
在终端上输入: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/maste ...
- 入门经典——基础数据结构专题(List)
UVA127 链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- MySQL常用命令总结3
id SMALLINT UNSIGNED [AUTO_INCREMENT] PRIMARY KEY, //把id定义为主键且自动排号,每张数据表只有一个主键,不能为NULL,确保记录唯一性 //省略a ...
- Run Loop简介
做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深层次的了解它,这样才能在使用的时候得心应手,出 ...
- WINDOWS下搭建SVN服务器端的步骤分享(Subversion)
1.获取svn程序 2.安装 Subversion(以下简称SVN)的服务器端和客户端.下载下来的服务器端是个 zip压缩包,直接解压缩即可,比如我解压到 E:\subversion .客户端安装文件 ...
- STM32F412应用开发笔记之八:迪文串口屏显示驱动
迪文的显示屏使用起来比较方便,其使用串口通讯,即可支持RS232,又可以支持TTL电平.在NUCLEO-F412ZG实验板上,USART2已经引到了CN9上,我们就利用USART2来实现与迪文串口屏的 ...
- 2017 ZSTU寒假排位赛 #2
题目链接:https://vjudge.net/contest/147632#overview. A题,状态压缩一下然后暴力即可. B题,水题,略过. C题,有负数,前缀和不是单调的,因此不能用尺取法 ...
- Sqlserver 时间字段批量增加
update dt_article_attribute_value set end_time = dateadd(mi,30,start_time) create table tb(dt dateti ...
- java系列--I/O流
java.io类 一.I/O流 1.流的概念 二. InputStream --此抽象类是表示字节输入流的所有类的超类. 1.public int read(byte[] b) throws IOEx ...