BZOJ3238:[AHOI 2013]差异
求一个字符串的∑ ∑ len[i] + len[j] - 2 * lcp(i, j),其中i,j表示从i,j开始的后缀。
方法一:SA+单调栈,自行yy。
方法二:SAM构造出来,然后每个状态对答案的贡献就是:C(|right_s|,2)*(Max_s-Max_parent_s)。前面使用的变量名含义与CLJ论文里的一致。right集合的大小需要构造后缀树然后从那些叶子节点开始算。
由于可以用马拉车在O(N)时间内枚举所有的回文串,所以在parent树中倍增找到每个回文串的出现次数即可。
跑得巨慢。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
//#include<iostream>
using namespace std; int n;
#define maxn 600011
char s[maxn]; struct samnode
{
int ch[],pre;
int pos;
samnode() {memset(ch,,sizeof(ch)); pre=;}
};
int pp[maxn],val[maxn];
struct SAM
{
samnode a[maxn];
int root,last,size;
SAM() {root=; a[].pos=; size=; last=root;}
int idx(char c) {return c-'a';}
void insert(char c,int p)
{
int id=idx(c),x=++size;
a[x].pos=p; pp[p]=x; val[x]=;
int y=last;
for (;y && !a[y].ch[id];y=a[y].pre) a[y].ch[id]=x;
last=x;
if (!y) a[x].pre=root;
else if (a[a[y].ch[id]].pos==a[y].pos+) a[x].pre=a[y].ch[id];
else
{
int z=a[y].ch[id],w=++size;
a[w]=a[z]; a[w].pos=a[y].pos+;
a[z].pre=a[x].pre=w;
for (;y && a[y].ch[id]==z;y=a[y].pre) a[y].ch[id]=w;
}
}
}sam; int list[maxn],fa[maxn][];
bool cmp(const int &i,const int &j) {return sam.a[i].pos>sam.a[j].pos;}
void build()
{
for (int i=;i<=sam.size;i++) list[i]=i,fa[i][]=sam.a[i].pre;
sort(list+,list++sam.size,cmp);
for (int j=;j<=;j++)
for (int i=;i<=sam.size;i++)
fa[i][j]=fa[fa[i][j-]][j-];
for (int i=;i<=sam.size;i++)
val[fa[list[i]][]]+=val[list[i]];
} #define LL long long
LL getans(int x,int len)
{
int p=pp[x];
for (int j=;j>=;j--) if (fa[p][j] && sam.a[fa[p][j]].pos>=len) p=fa[p][j];
// cout<<x<<' '<<len<<' '<<val[p]<<endl;
return 1ll*len*val[p];
} int mnc[maxn];
int main()
{
scanf("%s",s+);n=strlen(s+);
for (int i=;i<=n;i++) sam.insert(s[i],i);
build(); for (int i=n;i>=;i--)
{
s[(i<<)-]=s[i];
s[i<<]='#';
}
n=n+n-;
// cout<<s+1<<endl;
int id=;LL ans=;
for (int i=;i<=n;i++)
{
if (mnc[id]+id>i) mnc[i]=min(mnc[id*-i],mnc[id]+id-i);
else
{
mnc[i]=;
if (s[i]!='#') ans=max(ans,getans((i+)>>,));
}
while (i+mnc[i]<=n && i-mnc[i]> && s[i+mnc[i]]==s[i-mnc[i]])
{
if (s[i+mnc[i]]!='#') ans=max(ans,getans((i+mnc[i]+)>>,mnc[i]+));
mnc[i]++;
}
if (mnc[id]+id<mnc[i]+i) id=i;
// cout<<i<<' '<<mnc[i]<<endl;
}
printf("%lld\n",ans);
return ;
}
方法三:PAM。不会。
BZOJ3238:[AHOI 2013]差异的更多相关文章
- [BZOJ 3238] [AHOI 2013] 差异 【后缀数组 + 单调栈】
题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么 ...
- [AHOI 2013]差异
Description 题库链接 给定一个长度为 \(n\) 的字符串 \(S\) ,令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀.求 \[\sum_{1\leqslant i< ...
- 【BZOJ3238】[AHOI2013]差异
[BZOJ3238][AHOI2013]差异 题面 给定字符串\(S\),令\(T_i\)表示以它从第\(i\)个字符开始的后缀.求 \[ \sum_{1\leq i<j\leq n}len(T ...
- 【BZOJ3238】[Ahoi2013]差异 后缀数组+单调栈
[BZOJ3238][Ahoi2013]差异 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Ou ...
- BZOJ 3236 AHOI 2013 作业 莫队+树状数组
BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...
- 【BZOJ 3238】【AHOI 2013】差异
http://www.lydsy.com/JudgeOnline/problem.php?id=3238 后缀数组裸题但是\(5\times 10^5\)貌似常数有点大就过不了?(我的sa常数那么大想 ...
- 【AHOI 2013】差异
Problem Description 给定一个长度为 \(n\) 的字符串 \(S\),令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀.求 \(\sum_{1\leqslant i&l ...
- 【bzoj3238】 Ahoi2013—差异
http://www.lydsy.com/JudgeOnline/problem.php?id=3238 (题目链接) 题意 给出一个字符串,求${\sum_{1<=i<j<=n} ...
- BZOJ 3236 AHOI 2013 作业 莫队算法
题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:因为没有改动,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的 ...
随机推荐
- post和get区别,其他答案真的太坑
原理: get和post都是http定义与服务器交互的方法,还有put,delete url是网络上的资源,那么http中的get,post,put,delete对应的就是对这个资源的查,改,增,删四 ...
- Linux命令(008) -- yum
yum命令(全称为Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定的服务器自动下 ...
- python程序展现图片遇到的坑
使用cv2展示图片的时候遇到了问题,提示:TypeError: Required argument 'mat' (pos 2) not found 给定的图片路径是没得问题的,代码如下: 使用open ...
- 【转】Spark:Master High Availability(HA)高可用配置的2种实现
原博文出自于: 感谢! Spark Standalone集群是Master-Slaves架构的集群模式,和大部分的Master-Slaves结构集群一样,存在着Master单点故障的问题.如何解决这个 ...
- JavaScript Json与Map互转以及Map对象的取值方式
Json格式(Json字符串) : var json='{"name": "lily","age":"15"}' Map ...
- JavaScript设计模式 (1) 原型模式
原型模式(Prototype):用原型实例指向创建类对象,使用于创建新对象的类共享原型对象的属性以及方法. //图片轮播类 var LoopImages = function (imgArr, con ...
- centos如何离线安装部署node&pm2?
最近我们项目要上即时通讯,因为项目对安全要求比较高,所以选择了即时通讯云服务器yun2win,他们提供了数据服务器让我们自己安装部署.那么问题来了,我们服务器是放在内网,完全无法访问外网,而yun2w ...
- 探索 DWARF 调试格式信息
https://www.ibm.com/developerworks/cn/aix/library/au-dwarf-debug-format/ 简介 DWARF(使用有属性的记录格式进行调试 )是许 ...
- R语言学习 - 热图绘制heatmap
生成测试数据 绘图首先需要数据.通过生成一堆的向量,转换为矩阵,得到想要的数据. data <- c(1:6, 6:1, 6:1, 1:6, (6:1)/10, (1:6)/10, (1:6)/ ...
- IIS发布403报错
报错信息如下图 解决方案,inetmgr打开IIS,找到对应网站的目录浏览,双击 开启