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;
}

  

posted @ 2019-01-16 22:56 EM-LGH 阅读(...) 评论(...) 编辑 收藏

SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和相关推荐

  1. [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式 (hash构造后缀数组,二分答案)

    以后似乎终于不用去学后缀数组的倍增搞法||DC3等blablaSXBK的方法了= = 定义(来自关于后缀数组的那篇国家集训队论文..) 后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列S ...

  2. SPOJ 7258 SUBLEX 后缀自动机

    求第k大子串. 按拓扑序处理出一个点往后有多少条路径到终态. 答案就很明显了. #include <cstring> #include <cstdio> #define FOR ...

  3. 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)

    题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...

  4. POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)

    题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 ...

  5. SPOJ 7258 SUBLEX (SAM)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出一个串,查询字典序排在第k个的是哪个子串 ...

  6. SPOJ 694/705 后缀数组

    思路: 论文题*n Σn-i-ht[i]+1 就是结果 O(n)搞定~ //By SiriusRen #include <cstdio> #include <cstring> ...

  7. 【题解】P8865 [NOIP2022] 种花(二分答案,前缀和)

    [题解]P8865 [NOIP2022] 种花 场外 VP 选手.唯一场切的一道题,写篇题解纪念一下.( 顺便提一嘴:e 我是真的菜,,其他人&题解这道题都是 \(O(nm)\) 的,就我是 ...

  8. python实部虚部_以 3 为实部 4 为虚部, Python 复数的表达形式为 ___________ 或 ________ 。_键盘答案_学小易找答案...

    [简答题]请分析无锡中华老字号旅游商品--惠山泥人的经营现状,并未其开发与经营提出对策. [简答题]请阅读下面的程序,分析代码是否能够编译通过,如果能编译通过,请列出运行的结果,否则请说明编译失败的原 ...

  9. java语言中 逻辑常量_在 Java语言中 ,逻辑常量只有哪两个值 (true,false)_语文答案_学小易找答案...

    [单选题]推进增长动能转换,以加快发展先进制造业为重点全面提升( ) [单选题]甲状腺素可( )神经元突触的活动. [判断题]神经元接受两个的独立的时间上接近的刺激后,突触后电位是呈现一个非线性的叠加 ...

最新文章

  1. vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  2. 文巾解题 182. 查找重复的电子邮箱
  3. mysql分区失败_MYSQL表分区操作错误1503解决方案
  4. [转]Spring SpringMVC SpringBoot SpringCloud概念、关系及区别
  5. 【jQuery笔记Part1】04-webstorm定义活动模板
  6. 没有基础的人可以学python吗-没有任何基础的人,该如何学习Python?「附具体步骤」...
  7. 全网最详细的Android Studio卸载、安装和启动教程
  8. learning scala 变量
  9. Vijos——T 1092 全排列
  10. 【嵌入式技术】Atmega128串口详解
  11. 指纹识别算法c++实现
  12. PDF密码可以破解吗?有没有PDF解密的方法
  13. chrome 谷歌浏览器无法上网,IE浏览器可以上网
  14. 部署描述符[D:\apache-tomcat-9.0.38\conf\Catalina\localhost\books.xml]时出错
  15. Kali Linxu中打开Apache服务
  16. 基于Web开发资料专集
  17. 预制菜开启春节之战,破局立新正在进行时
  18. 服务器运行bat文件闪退,win10运行bat文件一闪而过怎么办_网站服务器运行维护
  19. 平头哥智能语音CB5654开发板如何读取云端的返回值
  20. linux密码配置文件详解,用户配置文件与密码配置文件

热门文章

  1. 系分 - 案例分析 - 项目管理
  2. 252T网盘资源包括:
  3. 排序算法的详解和分析对比(详细讲解)
  4. 项目管理 : 如何在项目中强调紧迫感?
  5. Wordpress使用CloudFlare的CDN来加速网站(页面规则缓存设置教程
  6. Python实现《合成孔径雷达成像——算法与实现》图3.13
  7. 服务器的智能监控管理结束,HART智能仪表在线监控系统的设计与实现
  8. Arduino学习笔记(1):太极创客 第一部分
  9. 安卓巴士总结了近百个Android优秀开源项目,覆盖Android开发的每个领域_拔剑-浆糊的传说_新浪博客...
  10. 为什么用了高防还是被DDoS打死