Problem

Description

给定一个长度为 \(n\) 的字符串 \(S\),令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀。求

\(\sum_{1\leqslant i<j\leqslant n}len(T_i)+len(T_j)-2\times len(lcp(T_i,T_j))\)

其中,\(len\)(a) 表示字符串 \(a\) 的长度,\(lcp\)(a,b) 表示字符串 \(a\) 和字符串 \(b\) 的最长公共前缀。

Input Format

一行,一个字符串 \(S\) 。

Output Format

一行,一个整数,表示所求值。

Sample

Input

cacao

Output

54

Range

\(2\leqslant n\leqslant 5\times 10^5\) ,且均为小写字母。

Algorithm

后缀自动机

Mentality

转换成统计每个字符对答案的贡献。

对于后缀自动机上的某个节点,便代表了某个等价类里的一堆连续子串,我们发现,这些子串中的字符产生贡献当且仅当两个后缀 \(T_1, T_2\) 一个经过当前节点,而另一个不经过。

那么这些字符产生的贡献就是经过当前节点的后缀数乘上不经过的后缀数。

Code

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define LL long long
#define go(x, i, v) for (int i = hd[x], v = to[i]; i; v = to[i = nx[i]])
LL read() {
long long x = 0, w = 1;
char ch = getchar();
while (!isdigit(ch)) w = ch == '-' ? -1 : 1, ch = getchar();
while (isdigit(ch)) {
x = (x << 3) + (x << 1) + ch - '0';
ch = getchar();
}
return x * w;
}
const int Max_n = 5e5 + 5, M = 26;
int n;
long long ans;
int num[Max_n << 1], nu[Max_n << 1];
char S[Max_n];
namespace SAM {
int las = 1, cnt = 1;
struct node {
int len, fa, ch[M];
} k[Max_n << 1];
void add(int c) {
int p = las, np = las = ++cnt;
k[np].len = k[p].len + 1, nu[np] = 1;
for (; p && !k[p].ch[c]; p = k[p].fa) k[p].ch[c] = np;
if (!p)
k[np].fa = 1;
else {
int q = k[p].ch[c];
if (k[q].len == k[p].len + 1)
k[np].fa = q;
else {
int nq = ++cnt;
k[nq] = k[q], k[nq].len = k[p].len + 1;
k[q].fa = k[np].fa = nq;
for (; p && k[p].ch[c] == q; p = k[p].fa) k[p].ch[c] = nq;
}
}
}
} // namespace SAM
using namespace SAM;
bool cmp(int a, int b) { return k[a].len < k[b].len; }
int main() {
scanf("%s", S + 1);
n = strlen(S + 1);
for (int i = n; i >= 1; i--) add(S[i] - 'a');
for (int i = 1; i <= cnt; i++) num[i] = i;
sort(num + 1, num + cnt + 1, cmp);
for (int i = cnt; i; i--) {
int x = num[i];
nu[k[x].fa] += nu[x];
ans += 1ll * nu[x] * (n - nu[x]) * (k[x].len - k[k[x].fa].len);
}
cout << ans;
}

【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:[AHOI 2013]差异

    求一个字符串的∑ ∑ len[i] + len[j] - 2 * lcp(i, j),其中i,j表示从i,j开始的后缀. 方法一:SA+单调栈,自行yy. 方法二:SAM构造出来,然后每个状态对答案的 ...

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

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

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

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

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

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

  7. 解题:AHOI 2013 作业

    题面 emmm......我把莫队扔到了杂题里,因为感觉局限挺大的=.= 这题是莫队维护信息+分块查询答案,都是两者的基本操作,复杂度$O(m$ $sqrt(n)+n$ $sqrt(m))$ 所以为啥 ...

  8. [ AHOI 2013 ] 作业 & [ BZOJ 3809 ] Gty的二逼妹子序列

    \(\\\) Description 给出一个长为 \(n\) 的数列 \(A\) 和 \(k\),多次询问: 对于一个区间 \([L_i,R_i]\),问区间内有多少个数在 \([a_i,b_i]\ ...

  9. [NOI 2015]品酒大会

    Description 题库链接 \(n\) 杯鸡尾酒排成一行,其中第 \(i\) 杯酒 (\(1 \leq i \leq n\)) 被贴上了一个标签 \(s_i\),每个标签都是 \(26\) 个小 ...

随机推荐

  1. node.js+react全栈实践

    利用业余时间写了个简单的项目,使用react+node.js做的一个全栈实践项目,前端参考了[React-Admin-Starter](https://github.com/veryStarters/ ...

  2. Xtrabackup 全备和还原以及增量备份和还原

    目录 MySQL环境介绍 全备和还原 准备备份目录 创建测试数据 全量备份 模拟删除数据 还原数据操作 第一步 备份备份文件 第二步 关闭数据库 第三步 移除数据库的data目录 第四步 恢复前准备 ...

  3. CSRF(Cross-site request forgery)跨站请求伪造

    CSRF是什么 CSRF(Cross-site request forgery)跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写 ...

  4. css4——浮动

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 不止面试-JVM垃圾回收面试题详解

    第一部分:面试题 本次分享我们将尝试回答以下问题: GC 是什么? 为什么要有 GC? 简单说一下java的垃圾回收机制. JVM的常见垃圾回收算法有哪些? 为什么要使用分代回收机制? 如何判断一个对 ...

  6. 一统江湖的大前端(8)- velocity.js 运动的姿势(上)

    [摘要] 介绍CSS动画和JS动画的基本特点,以及轻量级动画库velocity.js的基本用法. 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园 ...

  7. 转:spring4.0之二:@Configuration的使用

    从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplic ...

  8. HDU 6405 Make ZYB Happy(广义SAM)

    It's known to all that ZYB is godlike, so obviously he has a large number of titles, such as jskingj ...

  9. Coderfocers-616c

    You are given a rectangular field of n × m cells. Each cell is either empty or impassable (contains ...

  10. 解决pyinstaller在单一文件时无法正确添加权限清单问题,(UAC,uac_admin,manifest,asInvoker,python,requireAdministrator)

    做了3天的win10的兼容性测试,大部分时间都卡权限获取这了. 以下废话很多,想直接找解决方法,请跳至红字 首先,简单说下uac,自vista后windows再次加严了权限管理,uac (账户控制) ...