SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和
SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和
Code:
#include <cstdio>
#include <algorithm>
#include <cstring>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 1000000
#define ll long long
using namespace std;
char str[maxn];
int arr[maxn],pos[maxn],x[maxn],rk[maxn],sa[maxn],c[maxn],height[maxn];
ll C[maxn],brr[maxn];
int n,m;
struct SA{void qsort(){for(int i=0;i<=m;++i) c[i]=0;for(int i=1;i<=n;++i) ++c[rk[pos[i]]];for(int i=1;i<=m;++i) c[i]+=c[i-1];for(int i=n;i>=1;--i) sa[c[rk[pos[i]]]--]=pos[i]; }void build(){for(int i=1;i<=n;++i) rk[i]=arr[i],pos[i]=i; qsort();for(int k=1;k<=n;k<<=1){int num=0;for(int i=n-k+1;i<=n;++i) pos[++num]=i;for(int i=1;i<=n;++i) if(sa[i]>k) pos[++num]=sa[i]-k; qsort();swap(rk,pos);rk[sa[1]]=1,num=1;for(int i=2;i<=n;++i)rk[sa[i]]=(pos[sa[i]]==pos[sa[i-1]]&&pos[sa[i]+k]==pos[sa[i-1]+k])?num:++num;if(num==n) break;m=num; }}void get_height(){int k=1;for(int i=1;i<=n;++i) rk[sa[i]]=i; for(int i=1;i<=n;++i){if(k) --k;int j=sa[rk[i]-1];while(arr[i+k]==arr[j+k]) ++k;height[rk[i]]=k; }}
}T;
int main(){//setIO("input"); scanf("%s",str),n=strlen(str),m=128;for(int i=1;i<=n;++i) arr[i]=str[i-1]; T.build(),T.get_height(); for(int i=1;i<=n;++i) brr[i]=n-sa[i]+1-height[i];for(int i=1;i<=n;++i) C[i]=C[i-1]+brr[i];int q; long long opt; scanf("%d",&q);while(q--){scanf("%lld",&opt);int l=1,r=n,mid,ans=0; while(l<=r) {mid=(l+r)>>1;if(C[mid]>=opt) ans=mid,r=mid-1;else l=mid+1;}for(int i=sa[ans];i<=n-(C[ans]-opt);++i) printf("%c",str[i-1]); printf("\n");}return 0;
}
SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和相关推荐
- [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式 (hash构造后缀数组,二分答案)
以后似乎终于不用去学后缀数组的倍增搞法||DC3等blablaSXBK的方法了= = 定义(来自关于后缀数组的那篇国家集训队论文..) 后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列S ...
- SPOJ 7258 SUBLEX 后缀自动机
求第k大子串. 按拓扑序处理出一个点往后有多少条路径到终态. 答案就很明显了. #include <cstring> #include <cstdio> #define FOR ...
- 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)
题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...
- POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)
题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 ...
- SPOJ 7258 SUBLEX (SAM)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题目:给出一个串,查询字典序排在第k个的是哪个子串 ...
- SPOJ 694/705 后缀数组
思路: 论文题*n Σn-i-ht[i]+1 就是结果 O(n)搞定~ //By SiriusRen #include <cstdio> #include <cstring> ...
- 【题解】P8865 [NOIP2022] 种花(二分答案,前缀和)
[题解]P8865 [NOIP2022] 种花 场外 VP 选手.唯一场切的一道题,写篇题解纪念一下.( 顺便提一嘴:e 我是真的菜,,其他人&题解这道题都是 \(O(nm)\) 的,就我是 ...
- python实部虚部_以 3 为实部 4 为虚部, Python 复数的表达形式为 ___________ 或 ________ 。_键盘答案_学小易找答案...
[简答题]请分析无锡中华老字号旅游商品--惠山泥人的经营现状,并未其开发与经营提出对策. [简答题]请阅读下面的程序,分析代码是否能够编译通过,如果能编译通过,请列出运行的结果,否则请说明编译失败的原 ...
- java语言中 逻辑常量_在 Java语言中 ,逻辑常量只有哪两个值 (true,false)_语文答案_学小易找答案...
[单选题]推进增长动能转换,以加快发展先进制造业为重点全面提升( ) [单选题]甲状腺素可( )神经元突触的活动. [判断题]神经元接受两个的独立的时间上接近的刺激后,突触后电位是呈现一个非线性的叠加 ...
最新文章
- vscode pylint 错误_将实际未错误的py库添加到pylint白名单
- 文巾解题 182. 查找重复的电子邮箱
- mysql分区失败_MYSQL表分区操作错误1503解决方案
- [转]Spring SpringMVC SpringBoot SpringCloud概念、关系及区别
- 【jQuery笔记Part1】04-webstorm定义活动模板
- 没有基础的人可以学python吗-没有任何基础的人,该如何学习Python?「附具体步骤」...
- 全网最详细的Android Studio卸载、安装和启动教程
- learning scala 变量
- Vijos——T 1092 全排列
- 【嵌入式技术】Atmega128串口详解
- 指纹识别算法c++实现
- PDF密码可以破解吗?有没有PDF解密的方法
- chrome 谷歌浏览器无法上网,IE浏览器可以上网
- 部署描述符[D:\apache-tomcat-9.0.38\conf\Catalina\localhost\books.xml]时出错
- Kali Linxu中打开Apache服务
- 基于Web开发资料专集
- 预制菜开启春节之战,破局立新正在进行时
- 服务器运行bat文件闪退,win10运行bat文件一闪而过怎么办_网站服务器运行维护
- 平头哥智能语音CB5654开发板如何读取云端的返回值
- linux密码配置文件详解,用户配置文件与密码配置文件
热门文章
- 系分 - 案例分析 - 项目管理
- 252T网盘资源包括:
- 排序算法的详解和分析对比(详细讲解)
- 项目管理 : 如何在项目中强调紧迫感?
- Wordpress使用CloudFlare的CDN来加速网站(页面规则缓存设置教程
- Python实现《合成孔径雷达成像——算法与实现》图3.13
- 服务器的智能监控管理结束,HART智能仪表在线监控系统的设计与实现
- Arduino学习笔记(1):太极创客 第一部分
- 安卓巴士总结了近百个Android优秀开源项目,覆盖Android开发的每个领域_拔剑-浆糊的传说_新浪博客...
- 为什么用了高防还是被DDoS打死