求一个字符串的∑ ∑ 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]差异的更多相关文章

  1. [BZOJ 3238] [AHOI 2013] 差异 【后缀数组 + 单调栈】

    题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么 ...

  2. [AHOI 2013]差异

    Description 题库链接 给定一个长度为 \(n\) 的字符串 \(S\) ,令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀.求 \[\sum_{1\leqslant i< ...

  3. 【BZOJ3238】[AHOI2013]差异

    [BZOJ3238][AHOI2013]差异 题面 给定字符串\(S\),令\(T_i\)表示以它从第\(i\)个字符开始的后缀.求 \[ \sum_{1\leq i<j\leq n}len(T ...

  4. 【BZOJ3238】[Ahoi2013]差异 后缀数组+单调栈

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

  5. BZOJ 3236 AHOI 2013 作业 莫队+树状数组

    BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出     题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...

  6. 【BZOJ 3238】【AHOI 2013】差异

    http://www.lydsy.com/JudgeOnline/problem.php?id=3238 后缀数组裸题但是\(5\times 10^5\)貌似常数有点大就过不了?(我的sa常数那么大想 ...

  7. 【AHOI 2013】差异

    Problem Description 给定一个长度为 \(n\) 的字符串 \(S\),令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀.求 \(\sum_{1\leqslant i&l ...

  8. 【bzoj3238】 Ahoi2013—差异

    http://www.lydsy.com/JudgeOnline/problem.php?id=3238 (题目链接) 题意 给出一个字符串,求${\sum_{1<=i<j<=n} ...

  9. BZOJ 3236 AHOI 2013 作业 莫队算法

    题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:因为没有改动,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的 ...

随机推荐

  1. lodop 打印

    使用Lodop打印: 一.在官网下载http://www.lodop.net/download.html 若是安装还是提示未安装,就按转这个 二.准备两个js 三.需要在页面最上面加入 <htm ...

  2. Java多线程(二) synchronized 针对对象进行锁定

    http://www.cnblogs.com/QQParadise/articles/5059824.html 1.方法内的变量为线程安全的 2.实例变量非线程安全的 public class Has ...

  3. C++函数重载的4种错误示例

    函数重载的4种错误示例: #include <iostream> #include <string> using namespace std; //函数重载 同函数名,函数重载 ...

  4. 构造 Codeforces Round #107 (Div. 2) B. Phone Numbers

    题目传送门 /* 构造:结构体排个序,写的有些啰嗦,主要想用用流,少些了判断条件WA好几次:( */ #include <cstdio> #include <algorithm> ...

  5. Android 性能优化(25)*性能工具之「Systrace」Analyzing UI Performance with Systrace:用Systrace得到ui性能报告

    Analyzing UI Performance with Systrace In this document Overview 简介 Generating a Trace  生成Systrace文件 ...

  6. 数据传递-------@PathVariable

    package com.wh.handler; /** * 通过@PathVariable可以绑定占位符参数到方法参数中,例如 * @PathVariable("userId") ...

  7. c语言数据读入---sscanf、fscanf

    #include <iostream> #include <cstdio> #include <cstring> #include <stdlib.h> ...

  8. 为什么,博主我要写下这一系列windows实用网络?

    发现,随着自身一路过来所学,无论在大数据领域.还是linux  or  windows里,菜鸟的我慢慢在长大.把自己比作一个园,面积虽在增加,涉及面增多,但圆外的东西,还是那么多. 现在,正值在校读研 ...

  9. JS获取到时间转换成字符串类型

    JS获取到时间格式为:/Date(1479279579047)/ 提供一个函数可将其转换为“yyyy-MM-dd”和“yyyy-MM-dd hh:mm:ss” //时间日期转换成string func ...

  10. 连接服务器的mysql

    在服务器配置好Mysql 数据库,在客户端连接,报错: 解决方法: 1.在MySQL 数据库中修改user表,将host 中的localhoust 改为 %: 2.配置访问数据库的全选 根据需要配置权 ...