BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 2326 Solved: 1054
[Submit][Status][Discuss]
Description
Input
一行,一个字符串S
Output
一行,一个整数,表示所求值
Sample Input
Sample Output
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]差异 [后缀数组 单调栈]相关推荐
- [Ahoi2013]差异[后缀数组+单调栈]
链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...
- [BZOJ3238][AHOI2013]差异 [后缀数组+单调栈]
题目地址 - GO-> 题目大意: 给定一个长度为 nn 的字符串SS,令TiTi表示它从第ii个字符开始的后缀,求以下这个式子的值: ∑1≤i<j≤nlen(Ti)+len(Tj)−2× ...
- bzoj 3238: [Ahoi2013]差异(后缀数组+单调栈)
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 3443 Solved: 1562 [Submit][Stat ...
- [BZOJ 3238] [AHOI 2013] 差异 【后缀数组 + 单调栈】
题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么 ...
- [bzoj3238]差异(后缀数组+单调栈)
显然我们可以先把len(Ti)+len(Tj)的值先算出来,再把LCP减去.所有len(Ti)+len(Tj)的值为n*(n-1)*(n+1)/2,这个随便在纸上画一画就可以算出来的. 接下来问题就是 ...
- 【BZOJ3238】差异,后缀数组+单调栈维护height
Time:2016.05.23 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 题意已经说的很明白了. 关键在于如何快速求得各lcp的和 有一个重要的性质 排名为i和j(i<j ...
- BZOJ3879: SvT【后缀数组+单调栈】
Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始 ...
- POJ - 3415 Common Substrings(后缀数组+单调栈)
题目链接:点击查看 题目大意:给出两个字符串,再给出一个k,问两个字符串中长度大于等于k的公共子串有多少个(种类可重复) 题目分析:因为涉及到了子串问题,先用后缀数组跑出height数组来,接下来如果 ...
- 【BZOJ3879】SvT,后缀数组+单调栈维护sum
Time:2016.08.15 Author:xiaoyimi 转载注明出处谢谢 如果有不明白的地方可以在下面评论问我 传送门 思路: 建立后缀数组求出Height 如果说对每次询问暴力求LCP累加的 ...
最新文章
- 关于jQuery.click()函数
- python在函数内部访问外部全局变量的方法_在函数外部访问函数变量,而无需使用“全局”...
- vue 离开页面事件_【必看】58 道 Vue 常见面试题集锦,涵盖入门到精通,自测 Vue 掌握程度...
- .net 反射调用私有变量
- log4j2日志配置
- 计算机春季高考试题答案,最新春季高考历年真题-天津市春季高考计算机试卷...
- python sklearn做文本分类
- MySQL数据库入门学习 #CSDN博文精选# #IT技术# #数据库# #MySQL#
- 智能算法之免疫算法求解TSP问题
- Android文件的读写
- 计算机硬件大型作业报告,计算机硬件技术大作业报告 .doc
- 虚拟机与本机可以互ping,但是Xshell连不上虚拟机 的解决方法
- LabVIEW图表之双坐标轴
- python初中必背语法_初中英语考前必背重点语法知识汇总,高分必备,强烈建议收藏!...
- cad相贯展开图lisp_cad相贯线的画法
- 易班总是显示服务器出错,易班
- 【STM32】stm32驱动TB6600控制42/57步进电机的案例(TIM中断和PWM实验)
- mysql 时间盲注语句,sql注入学习记录(5)-基于时间延迟的SQL盲注
- MavLink通信协议 C++应用详细教程
- linux压缩命令zip详解,Linux中zip压缩和unzip解压缩命令详解
热门文章
- 文档智能理解:通用文档预训练模型与数据集
- 对GCN,Transformer, XLNet, ALBERT, CRF等技术仍然一知半解?再不学习就OUT了!
- NLP工具包(Albert+BiLSTM+CRF)
- 归并有效排序算法matlab,科学网—[用MATLAB写算法]之排序算法2)归并排序merge sort - 徐勇刚的博文...
- python 操作同花顺下单程序_Py(76)Python/C API 参考手册:操作系统实用程序
- adb工具 手工操作android模拟器上的数据库
- php 星号邮箱,PHP以星号隐藏用户名手机号码和邮箱实例
- 不相交轮换的乘积怎么求_浅谈两种求条件极值的方法
- SpringBoot2.0之三 优雅整合Spring Data JPA
- Netty HashedWheelTimer 定时任务调用