[Ahoi2013]差异
后缀数组+单调栈
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = ; const int MAXN = N; struct SuffixArray{
int wa[MAXN];
int wb[MAXN];
int wv[MAXN];
int ws[MAXN]; int sa[MAXN];
int rank[MAXN];
int height[MAXN];
int r[MAXN];
int n;
int m; void input(int *val, int len, int Max){
for (int i = ;i < len;i++)
r[i] = val[i];
r[len] = ;
n = len;
m = Max;
calSa();
calHeight();
} int cmp(int *r, int a, int b, int l){
return (r[a] == r[b] && r[a + l] == r[b + l]);
} void calSa(){
int i, j, p, *x = wa, *y = wb, *t;
for (i = ;i < m;i++) ws[i] = ;
for (i = ;i < n + ;i++) ws[x[i] = r[i]]++;
for (i = ;i < m;i++) ws[i] += ws[i - ];
for (i = n;i >= ;i--) sa[--ws[x[i]]] = i;
for (j = , p = ;p < n + ;j *= , m = p){
for (p = , i = n - j + ;i < n + ;i++) y[p++] = i;
for (i = ;i < n + ;i++) if (sa[i] >= j) y[p++] = sa[i] - j;
for (i = ;i < n + ;i++) wv[i] = x[y[i]];
for (i = ;i < m;i++) ws[i] = ;
for (i = ;i < n + ;i++) ws[wv[i]]++;
for (i = ;i < m;i++) ws[i] += ws[i - ];
for (i = n;i >= ;i--) sa[--ws[wv[i]]] = y[i];
for (t = x, x = y, y = t, p = , x[sa[]] = , i = ; i < n + ;i++)
x[sa[i]] = cmp(y, sa[i - ], sa[i], j) ? p - : p++;
}
} void calHeight(){
int i, j, k = ;
for (i = ;i <= n;i++) rank[sa[i]] = i;
for (i = ;i < n;height[rank[i++]] = k)
for (k?k--:, j = sa[rank[i]- ];r[i + k] == r[j + k];k++);
} int Log[MAXN];
int best[][MAXN];
void initRMQ() {
Log[] = -;
for(int i = ;i <= MAXN;i++){
Log[i]=(i & (i - ))?Log[i - ] : Log[i - ] + ;
}
for(int i = ; i <= n ; i ++) best[][i] = height[i];
for(int i = ; i <= Log[n] ; i ++) {
int limit = n - (<<i) + ;
for(int j = ; j <= limit ; j ++) {
best[i][j] = (best[i-][j] > best[i-][j+(<<i>>)]) ? best[i-][j+(<<i>>)] : best[i-][j];
}
}
}
int lcp(int a,int b) {
a = rank[a]; b = rank[b];
if(a > b){
int t = a;
a = b;
b = t;
}
a ++;
int t = Log[b - a + ];
return (best[t][a] > best[t][b - (<<t) + ])? best[t][b - (<<t) + ] : best[t][a];
}
}SA;
int a[N],i,len,top,stack[N];
long long ans,sum;
char s[N];
int main()
{
scanf("%s",&s);
len=strlen(s);
for (i=;i<=len;i++)
{
ans=ans+(long long)i*(len-);
a[i-]=s[i-];
}
SA.input(a,len,);
for (i=;i<=len;i++)
{
while (SA.height[i]<SA.height[stack[top]])
{
sum=sum-(long long)(stack[top]-stack[top-])*SA.height[stack[top]];
top--;
}
top++;stack[top]=i;
sum=sum+(long long)(stack[top]-stack[top-])*SA.height[stack[top]];
ans=ans-*sum;
}
printf("%lld\n",ans);
}
//3 1 4 2 5 0
[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]差异_后缀自动机
BZOJ_3238_[Ahoi2013]差异_后缀自动机 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sam ...
- BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈
BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao ...
- 【LG4248】[AHOI2013]差异
[LG4248][AHOI2013]差异 题面 洛谷 题解 后缀数组版做法戳我 我们将原串\(reverse\),根据后缀自动机的性质,两个后缀的\(lcp\)一定是我们在反串后两个前缀的\(lca\ ...
- 【BZOJ3238】[AHOI2013]差异
[BZOJ3238][AHOI2013]差异 题面 给定字符串\(S\),令\(T_i\)表示以它从第\(i\)个字符开始的后缀.求 \[ \sum_{1\leq i<j\leq n}len(T ...
- P4248 [AHOI2013]差异 解题报告
P4248 [AHOI2013]差异 题目描述 给定一个长度为 \(n\) 的字符串 \(S\),令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀.求 \[\displaystyle \s ...
- 【BZOJ 3238】 3238: [Ahoi2013]差异(SAM)
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3047 Solved: 1375 Description In ...
- bzoj 3238: [Ahoi2013]差异 -- 后缀数组
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MB Description Input 一行,一个字符串S Output 一行,一个 ...
随机推荐
- How to create a project with Oracle Policy Modeling
This blog is about how to create a project with Oracle Policy Modeling. You can do it successfully i ...
- ios8 tableView设置滑动删除时 显示多个按钮
** * tableView:editActionsForRowAtIndexPath: //设置滑动删除时显示多个按钮 * UITableViewRowAction ...
- FS210开发板上Qt4.7.0移植过程
作者:冯老师,华清远见嵌入式学院讲师. 1. 搭建Qt开发环境平台 1.开发环境:ubuntu 12.04 2.交叉编译链:arm-cortex_a8-linux-gnueabi 3.开发板:FS21 ...
- DropDownList 选中change
<script language="javascript" type="text/javascript">$(function(){ $(&q ...
- 全浏览器收藏网站javascript
function MyFavorite(sURL, sTitle) { var ctrl = (navigator.userAgent.toLowerCase()).indexOf('mac') != ...
- jquery插件之拖拽改变元素大小
该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的拖拽改变元素大小的效果,您可以根据自己的实际需求来设置被 ...
- UIDynamic(物理仿真)
简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如: 重力.弹性碰撞等现象 物理引 ...
- 【HDU4585 Shaolin】map的经典运用
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4585 题意大意:很多人想进少林寺,少林寺最开始只有一个和尚,每个人有有一个武力值,若这个人想进少林,必 ...
- 解决PHP下导出csv乱码小记
我们之前都是使用PHPexcel导出我们的一些数据的,由于Phpexcel对导出超出1万条数据会导至超时和内存暴涨,后来我们就改用数据导出成csv格式的. 相信很多朋友们在用PHP导出csv文件时都遇 ...
- Java序列化机制
java的序列化机制支持将对象序列化为本地文件或者通过网络传输至别处, 而反序列化则可以读取流中的数据, 并将其转换为java对象. 被序列化的类需要实现Serializable接口, 使用Objec ...