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的 ...
随机推荐
- Linux day01(二)虚拟机快照和克隆的用法介绍
一:快照 优点:运行虚拟机后不用担心系统会被弄崩溃了,点击快照会立即恢复到初始状态 缺点:回滚会带来数据的丢失,所以要考虑数据恢复的成本和找回数据时进行操作的成本 1. 在导航栏中找虚拟机快照的小图标 ...
- 台哥原创:java 连连看源码
2010年,迷上了玩连连看 随手就做了这个,正好手头有这些图片素材 游戏启动时,界面先铺上了一层透明幕布,然后这些兵器图片交替从上到下,从左到右出现.. 鼠标停在兵器格子上时,所在格子会有红色 ...
- jQuery——表单应用(1)
实现结果:聚焦表单的input部分时,input格式变更为CSS样式(获取和失去焦点改变样式) HTML: <!DOCTYPE html> <html> <head> ...
- ASP.Net 知识点总结(三)
1.描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:不是.可以用任意类型. 2.<%# %> 和 <% %> 有什么区别? 答:<%# %>表示绑定 ...
- [SHOI2013]超级跳马
题目描述 现有一个n 行m 列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.试求跳法种数mod 30011. 输入输出格式 输入格式: ...
- LN : leetcode 529 Minesweeper
lc 529 Minesweeper 529 Minesweeper Let's play the minesweeper game! You are given a 2D char matrix r ...
- ubantu MongoDB安装
转 https://blog.csdn.net/flyfish111222/article/details/51886787 本博文介绍了MongoDB,并详细指引读者在Ubuntu下MongoDB的 ...
- 【Linux】 JDK安装及配置 (linux-tar.gz版)
安装环境:Linux(CentOS 7 64位 版) JDK安装:tar.gz为解压后就可以使用的版本,这里使用jdk-8u211-linux-x64.tar.gz版,安装到/usr/java/(us ...
- lsb_release No LSB modules are available
lsb_release 提示: No LSB modules are available 执行: sudo apt-get install lsb-core
- SpringMVC接收多参数的处理方法
问题:依赖SpringMVC自带的机制解析多对象参数往往出现解析不了的问题,使用较为复杂. 解决思路:前端 JS 先把传递到后台的对象转换为 JSON 字符串,后台直接使用字符串类型接收,再使用 st ...