BZOJ 3238 【AHOI2013】 差异
题目链接:差异
写题时发现这道题当初已经用后缀数组写过了……但是既然学了后缀自动机那就再写一遍吧……
观察一下题目所给的式子:\[\sum_{1\leqslant i < j \leqslant n}len(T_i)+len(T_j)-2lcp(T_i,T_j)\]
可以发现前面两项其实是可以在\(O(n)\)的时间内算出来的。于是我们就只需要考虑后面那一项怎么算。
题目要求的是所有后缀的最长公共前缀之和,那么把串反一下就变成了所有前缀的最长公共后缀之和。
那么,我们构出翻转后的串的\(parent\)树(其实就是原串的后缀树),两个串的公共后缀就是他们在\(parent\)树上的\(lca\)节点包含的最长子串长度。
然后我们就可以枚举每个节点作为\(lca\),然后统计一下它的两两子树\(right\)集合大小之积即可。
下面贴代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 1000010 using namespace std;
typedef long long llg; char s[maxn>>1];
int n,tot,la,head[maxn],next[maxn],to[maxn],tt;
int son[maxn][26],len[maxn],fa[maxn],siz[maxn];
llg ans; void link(int x,int y){to[++tt]=y;next[tt]=head[x];head[x]=tt;}
void insert(int p,int x){
int np=++tot; siz[np]=1; len[np]=len[p]+1;
for(;p && !son[p][x];p=fa[p]) son[p][x]=np;
if(!p) fa[np]=1;
else{
int q=son[p][x];
if(len[q]==len[p]+1) fa[np]=q;
else{
int nq=++tot;
memcpy(son[nq],son[q],sizeof(son[q]));
fa[nq]=fa[q]; fa[np]=fa[q]=nq; len[nq]=len[p]+1;
for(;son[p][x]==q;p=fa[p]) son[p][x]=nq;
}
}
la=np;
} void dfs(int u){
for(int i=head[u],v;v=to[i],i;i=next[i]){
dfs(v);
ans-=(llg)siz[u]*siz[v]*len[u],siz[u]+=siz[v];
}
} int main(){
File("a");
scanf("%s",s+1); n=strlen(s+1); tot=la=1;
for(int i=n>>1;i;i--) swap(s[i],s[n-i+1]);
for(int i=1;i<=n;i++) insert(la,s[i]-'a');
for(int i=2;i<=tot;i++) link(fa[i],i);
dfs(1); ans<<=1; ans+=((llg)(n+1)*n*(n-1))>>1;
printf("%lld\n",ans);
return 0;
}
BZOJ 3238 【AHOI2013】 差异的更多相关文章
- BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1054[Submit][Status ...
- bzoj 3238 Ahoi2013 差异
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2357 Solved: 1067[Submit][Status ...
- BZOJ 3238: [Ahoi2013]差异 [后缀自动机]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2512 Solved: 1140[Submit][Status ...
- bzoj 3238: [Ahoi2013]差异 -- 后缀数组
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MB Description Input 一行,一个字符串S Output 一行,一个 ...
- ●BZOJ 3238 [Ahoi2013]差异
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3238 题解: 后缀数组套路深. 问题转化为求出任意两个后缀的LCP之和 在计算贡献时,各种不 ...
- 洛谷 P4248: bzoj 3238: [AHOI2013]差异
题目传送门:洛谷 P4248. 题意简述: 定义两个字符串 \(S\) 和 \(T\) 的差异 \(\operatorname{diff}(S,T)\) 为这两个串的长度之和减去两倍的这两个串的最长公 ...
- BZOJ 3238 [Ahoi2013]差异(后缀自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3238 [题目大意] 给出一个串,设T[i]表示从第i位开始的后缀, 求sum(len( ...
- BZOJ 3238: [Ahoi2013]差异 后缀自动机 树形dp
http://www.lydsy.com/JudgeOnline/problem.php?id=3238 就算是全局变量,也不要忘记,初始化(吐血). 长得一副lca样,没想到是个树形dp(小丫头还有 ...
- BZOJ 3238: [Ahoi2013]差异((单调栈+后缀数组)/(后缀树))
[传送门[(https://www.lydsy.com/JudgeOnline/problem.php?id=3238) 解题思路 首先原式可以把\(len\)那部分直接算出来,然后通过后缀数组求\( ...
- BZOJ.3238.[AHOI2013]差异(后缀自动机 树形DP/后缀数组 单调栈)
题目链接 \(Description\) \(Solution\) len(Ti)+len(Tj)可以直接算出来,每个小于n的长度会被计算n-1次. \[\sum_{i=1}^n\sum_{j=i+1 ...
随机推荐
- Mac环境下搭建PhoneGap环境
首先,官方文档中,要求,编译需要使用Intel架构的 Mac OS X系统的Mac设备,最低要使用XCode4.5以上版本和Mac OS X 10.7以上的系统以及IOS6.0 以上的SDK,至于发布 ...
- 【HTTP header】【Access-Control-Allow-Credentials】跨域Ajax请求时是否带Cookie的设置
1. 无关Cookie跨域Ajax请求 客户端 以 Jquery 的 ajax 为例: $.ajax({ url : 'http://remote.domain.com/corsrequest', d ...
- docker swarm+register-web+shipyard搭建
1.swarm安装 swarm安装有很多种服务注册的方式,token.etcd.zookeeper,本文主要以swarm默认的token方式进行安装.因为最新的docker已经集成了swarm,所以从 ...
- 查看、关闭登录到linux的终端
基本概念: tty(终端设备的统称):tty一词源于Teletypes,原来指的是电传打字机,是通过串行线用打印机键盘阅读和发送信息的东西,后来这东西被键盘和显示器取代,所以现在叫终端比较合适.终端是 ...
- ZOJ 3202 Second-price Auction
Second-price Auction Time Limit: 1 Second Memory Limit: 32768 KB Do you know second-price aucti ...
- Spring - Bean Definition Bean定义 给容易提供元数据的3方法
Spring Bean Definition https://www.tutorialspoint.com/spring/spring_bean_definition.htm The objects ...
- UIWebView中加载的网页尺寸太大,如何让网页适应屏幕大小 WebView加载HTML图片大小自适应与文章自动换行
webview.scalesPageToFit = YES; http://www.cnblogs.com/yujidewu/p/5740934.html 若需要根据图片原本大小,宽度小于320px的 ...
- Postgresql 正则表达式(转)
原文:http://blog.csdn.net/wugewuge/article/details/7704996 postgresql支持POSIX 风格的正则表达式,在postgresql中使用正则 ...
- Nginx反向代理服务器安装与配置
一.服务器安装: sudo yum install gcc-c++ sudo yum install pcre pcre-devel sudo yum install zlib zlib-devel ...
- Swagger2 生成 Spring Boot API 文档
Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.本文主要介绍了在 Spring Boot 添加 Swagger 支持, 生成可自动维护的 A ...