求一个字符串的∑ ∑ 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. Swift5.1 语言指南(二十九)高级运算符

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. C#自动内存分配

    一.在程序运行时由CLR管理内存分配(Memory Allocation),程序启动时,操作系统会为每一个线程申请一个独立的栈内存,用于存储方法的局部变量.参数和返回值等:CLR会为进程申请一个连续的 ...

  3. Linux环境下修改MySQL数据库对表名大小写不敏感

    Linux系统中MySQL对数据库名称和表名是大小写敏感的,这就导致了一些麻烦,虽然已经建立了表和数据,但因为大小写导致无法找到表. MySQL数据库对表名大小写不敏感的设置方法如下: 1.查看MyS ...

  4. 安装Kali里的应用程序或软件包

    安装Kali里的应用程序或软件包 安装额外的软件是apt-get命令最基本的功能了,命令非常简单易懂.安装软件包的语法如下: apt-get install 软件包名 比如,安装图像编辑软件gimp, ...

  5. JDBC和数据库连接池

    JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成. ​ ● JDBC ​ ● C3P0 ​ ● DRUID 一.JDBC ...

  6. Laravel5.1学习笔记22 Eloquent 调整修改

    Eloquent: Mutators Introduction Accessors & Mutators Date Mutators Attribute Casting Introductio ...

  7. Laravel5.1学习笔记21 EloquentORM 集合

    Eloquent: Collections Introduction Available Methods Custom Collections Introduction All multi-resul ...

  8. Code Kata:大整数四则运算—乘法 javascript实现

    上周练习了加减法,今天练习大整数的乘法运算. 采取的方式同样为竖式计算,每一位相乘后相加. 乘法函数: 异符号相乘时结果为负数,0乘任何数都为0 需要调用加法函数 因为输入输出的为字符串,需要去除字符 ...

  9. 配置Tomcat && Http简介

    WEB环境搭建 1. Web服务器 Web服务器主要用来接收客户端发送的请求和响应客户端请求. 作为JavaWeb程序来说,还需要有Servet容器,容器的主要作用就是调用java程序处理用户发送的请 ...

  10. 左耳听风 ARTS Week 001

    要求:1.每周至少做一个 leetcode 的算法题 2.阅读并点评至少一篇英文技术文章 3.学习至少一个技术技巧 4.分享一篇有观点和思考的技术文章 1.每周至少做一个 leetcode 的算法题 ...