3238: [Ahoi2013]差异

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 2326  Solved: 1054
[Submit][Status][Discuss]

Description

Input

一行,一个字符串S

Output

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

Sample Input

cacao

Sample Output

54

HINT

2<=N<=500000,S由小写英文字母组成


集训的时候想出来了还讲了一下 bingo!

前面的式子随便找一下规律(想一下矩阵),发现求和时一个数贡献(n-1)次.......

后面很显然就是求一个height[i]在多长的区间内是最小的,然后贡献上这一段答案 左长度*右长度*height

求这个不是裸单调栈嘛

发现以前单调栈写的太..了,,,st[]保存的是元素编号,l[i]和r[i]是i往两段延伸的长度,发现很多人两遍,一遍就可以了

//
//  main.cpp
//  bzoj3238
//
//  Created by Candy on 2017/1/4.
//  Copyright © 2017年 Candy. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N=5e5+5;
typedef long long ll;
int n;
char s[N];
int sa[N],rnk[N],t1[N],t2[N],height[N],c[N];
bool cmp(int *r,int a,int b,int j){return a+j<=n&&b+j<=n&&r[a]==r[b]&&r[a+j]==r[b+j];
}
void getSA(int m){int *r=t1,*k=t2;for(int i=1;i<=n;i++) c[r[i]=s[i]]++;for(int i=1;i<=m;i++) c[i]+=c[i-1];for(int i=n;i>=1;i--) sa[c[r[i]]--]=i;for(int j=1;j<=n;j<<=1){int p=0;for(int i=n-j+1;i<=n;i++) k[++p]=i;for(int i=1;i<=n;i++) if(sa[i]>j) k[++p]=sa[i]-j;for(int i=0;i<=m;i++) c[i]=0;for(int i=1;i<=n;i++) c[r[k[i]]]++;for(int i=1;i<=m;i++) c[i]+=c[i-1];for(int i=n;i>=1;i--) sa[c[r[k[i]]]--]=k[i];swap(r,k);p=0;r[sa[1]]=++p;for(int i=2;i<=n;i++) r[sa[i]]=cmp(k,sa[i],sa[i-1],j)?p:++p;if(p>=n) break;m=p;}
}
void getHeight(){for(int i=1;i<=n;i++) rnk[sa[i]]=i;int k=0;for(int i=1;i<=n;i++){if(k) k--;if(rnk[i]==1) continue;int j=sa[rnk[i]-1];while(i+k<=n&&j+k<=n&&s[i+k]==s[j+k]) k++;height[rnk[i]]=k;}
}int st[N],l[N],r[N],top;
void solve(){ //for(int i=1;i<=n;i++) printf("hi %d %d %d\n",sa[i],rnk[i],height[i]);ll ans=(ll)n*(n+1)*(n-1)/2;for(int i=1;i<=n;i++){int le=i;while(top&&height[st[top]]>=height[i]){le=l[st[top]];r[st[top]]=i-1;top--;}st[++top]=i;l[i]=le;}while(top) r[st[top--]]=n;for(int i=1;i<=n;i++) ans-=(ll)2*height[i]*(i-l[i]+1)*(r[i]-i+1);printf("%lld",ans);
}
int main(int argc, const char * argv[]) {scanf("%s",s+1);n=strlen(s+1);getSA(300);getHeight();solve();return 0;
}

转载于:https://www.cnblogs.com/candy99/p/6250732.html

BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]相关推荐

  1. [Ahoi2013]差异[后缀数组+单调栈]

    链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...

  2. [BZOJ3238][AHOI2013]差异 [后缀数组+单调栈]

    题目地址 - GO-> 题目大意: 给定一个长度为 nn 的字符串SS,令TiTi表示它从第ii个字符开始的后缀,求以下这个式子的值: ∑1≤i<j≤nlen(Ti)+len(Tj)−2× ...

  3. bzoj 3238: [Ahoi2013]差异(后缀数组+单调栈)

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 3443  Solved: 1562 [Submit][Stat ...

  4. [BZOJ 3238] [AHOI 2013] 差异 【后缀数组 + 单调栈】

    题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么 ...

  5. [bzoj3238]差异(后缀数组+单调栈)

    显然我们可以先把len(Ti)+len(Tj)的值先算出来,再把LCP减去.所有len(Ti)+len(Tj)的值为n*(n-1)*(n+1)/2,这个随便在纸上画一画就可以算出来的. 接下来问题就是 ...

  6. 【BZOJ3238】差异,后缀数组+单调栈维护height

    Time:2016.05.23 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 题意已经说的很明白了. 关键在于如何快速求得各lcp的和 有一个重要的性质 排名为i和j(i<j ...

  7. BZOJ3879: SvT【后缀数组+单调栈】

    Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始 ...

  8. POJ - 3415 Common Substrings(后缀数组+单调栈)

    题目链接:点击查看 题目大意:给出两个字符串,再给出一个k,问两个字符串中长度大于等于k的公共子串有多少个(种类可重复) 题目分析:因为涉及到了子串问题,先用后缀数组跑出height数组来,接下来如果 ...

  9. 【BZOJ3879】SvT,后缀数组+单调栈维护sum

    Time:2016.08.15 Author:xiaoyimi 转载注明出处谢谢 如果有不明白的地方可以在下面评论问我 传送门 思路: 建立后缀数组求出Height 如果说对每次询问暴力求LCP累加的 ...

最新文章

  1. 关于jQuery.click()函数
  2. python在函数内部访问外部全局变量的方法_在函数外部访问函数变量,而无需使用“全局”...
  3. vue 离开页面事件_【必看】58 道 Vue 常见面试题集锦,涵盖入门到精通,自测 Vue 掌握程度...
  4. .net 反射调用私有变量
  5. log4j2日志配置
  6. 计算机春季高考试题答案,最新春季高考历年真题-天津市春季高考计算机试卷...
  7. python sklearn做文本分类
  8. MySQL数据库入门学习 #CSDN博文精选# #IT技术# #数据库# #MySQL#
  9. 智能算法之免疫算法求解TSP问题
  10. Android文件的读写
  11. 计算机硬件大型作业报告,计算机硬件技术大作业报告 .doc
  12. 虚拟机与本机可以互ping,但是Xshell连不上虚拟机 的解决方法
  13. LabVIEW图表之双坐标轴
  14. python初中必背语法_初中英语考前必背重点语法知识汇总,高分必备,强烈建议收藏!...
  15. cad相贯展开图lisp_cad相贯线的画法
  16. 易班总是显示服务器出错,易班
  17. 【STM32】stm32驱动TB6600控制42/57步进电机的案例(TIM中断和PWM实验)
  18. mysql 时间盲注语句,sql注入学习记录(5)-基于时间延迟的SQL盲注
  19. MavLink通信协议 C++应用详细教程
  20. linux压缩命令zip详解,Linux中zip压缩和unzip解压缩命令详解

热门文章

  1. 文档智能理解:通用文档预训练模型与数据集
  2. 对GCN,Transformer, XLNet, ALBERT, CRF等技术仍然一知半解?再不学习就OUT了!
  3. NLP工具包(Albert+BiLSTM+CRF)
  4. 归并有效排序算法matlab,科学网—[用MATLAB写算法]之排序算法2)归并排序merge sort - 徐勇刚的博文...
  5. python 操作同花顺下单程序_Py(76)Python/C API 参考手册:操作系统实用程序
  6. adb工具 手工操作android模拟器上的数据库
  7. php 星号邮箱,PHP以星号隐藏用户名手机号码和邮箱实例
  8. 不相交轮换的乘积怎么求_浅谈两种求条件极值的方法
  9. SpringBoot2.0之三 优雅整合Spring Data JPA
  10. Netty HashedWheelTimer 定时任务调用