【BZOJ】 3238: [Ahoi2013]差异
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3238
求:$${\sum _{i=1}^{n-1}\sum _{j=i+1}^{n}len(T_i)len(T_j)-2lcp(T_i,T_j)}$$
$T_i$表示从第$i$个字符开始的后缀。
原式${=n(n+1)(n-1)-\sum _{i=1}^{n-1}\sum _{j=i+1}^{n}2lcp(T_i,T_j)}$
这不就是NOI2015品酒大会的第一问啦,利用SAM构出后缀树,每个后缀对应一个后缀树上的点,${lcp(x,y)=deep[lca(x,y)]}$,树形统计一下即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 500010*2
#define llg long long
#define SIZE 26
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,ans,ans1[maxn],size[maxn];
char s[maxn]; struct SAM
{
struct
{
llg len,f,ch[SIZE];
void init()
{
len=,f=-;
memset(ch,0xff,sizeof(ch));
}
}e[maxn<<]; vector<llg>a[maxn<<];
llg idx,last,size[maxn<<]; void init(){idx=last=; e[idx++].init(); memset(size,,sizeof(size));} llg newnode() {e[idx].init(); return idx++;} void insert(llg c)
{
llg end=newnode(),tmp=last;
e[end].len=e[last].len+; size[end]=;
for (;tmp!=- && e[tmp].ch[c]==-;tmp=e[tmp].f) e[tmp].ch[c]=end;
if (tmp==-) e[end].f=;
else
{
llg nxt=e[tmp].ch[c];
if (e[tmp].len+==e[nxt].len) e[end].f=nxt;
else
{
llg np=newnode();
e[np]=e[nxt];
e[np].len=e[tmp].len+;
e[nxt].f=e[end].f=np;
for (;tmp!=- && e[tmp].ch[c]==nxt;tmp=e[tmp].f) e[tmp].ch[c]=np;
}
}
last=end;
} void link_fa() {for (llg i=;i<idx;i++) a[e[i].f].push_back(i);} void dp(llg x)
{
llg w=a[x].size(),v;
for (llg i=;i<w;i++) dp(a[x][i]);
for (llg i=;i<w;i++)
{
v=a[x][i];
ans1[e[x].len]+=size[x]*size[v];
size[x]+=size[v];
}
} }sam; int main()
{
yyj("bzoj3238");
scanf("%s",s);
n=strlen(s);
sam.init();
for (llg i=n-;i>=;i--) sam.insert(s[i]-'a');
sam.link_fa();
sam.dp();
ans=n*(n+)*(n-);
ans/=;
for (llg i=;i<=n;i++) ans-=i*ans1[i]*;
cout<<ans<<endl;
return ;
}
【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 ...
随机推荐
- Spark Core(四)用LogQuery的例子来说明Executor是如何运算RDD的算子(转载)
1. 究竟是怎么运行的? 很多的博客里大量的讲了什么是RDD, Dependency, Shuffle.......但是究竟那些Executor是怎么运行你提交的代码段的? 下面是一个日志分析的例子, ...
- python接口测试中安装whl格式的requests第三方模块
下载 安装 requests第三方模块 下载:http://docs.python-requests.org/en/latest/user/install/#install 我下载是 https:// ...
- [LeetCode] 285. Inorder Successor in BST_Medium tag: Inorder Traversal
Given a binary search tree and a node in it, find the in-order successor of that node in the BST. No ...
- Keras 源码分析
. │ activations.py │ callbacks.py │ constraints.py │ initializations.py │ metrics.py │ models.py │ o ...
- C# 后台动态添加标签(span,div) 以及模板添加
很多时候.我们需要在后台用C#代码添加html标签.而不是在html源码中添加. 比如在html源码中简单的一个input 标签 <input type="type" nam ...
- 当输入域失去焦点 (blur) 时改变其颜色
$("input").blur(function(){ $("input").css("background-color","#D ...
- JAVA如何调用mysql写的存储过程
存储过程是干什么的,自己百度,百度上讲的比我讲的好.为什么要用存储过程,这样可以提高效率.废话少说,直接上代码: 首先说一下语法:在mysql中写存储过程 DELIMITER $$ CREATE /* ...
- 527D Clique Problem 判断一维线段没有两辆相交的最大线段数量
这题说的是给了n个位置 在x轴上 每个位置有一个权值为wi,然后将|xi - xj|>=wi+wj ,满足这个条件的点建一条边,计算着整张图中有多少多少个点构成的子图,使得这个子图的节点数尽量的 ...
- SpringMVC+Spring+Mybatis+Maven+mysql整合
一.准备工作1.工具:jdk1.7.0_80(64)+tomcat7.0.68+myeclipse10.6+mysql-5.5.48-win322. 开发环境安装配置.Maven项目创建(参考:htt ...
- Python: re.compile最短匹配模式,只取双引号内的值\“
用正则表达式匹配某个文本模式 1.只取双引号内的值 2.长短匹配模式对比 贪婪模式: 模式r'\"(.*)\" '的意图是匹配被双引号包含的文本,但是这个表达式中*是贪婪的 ...