思路:

第一问

建出来后缀数组以后  前缀和一发n-sa[i]-ht[i]+1  二分

第二问

二分判断是带重复的第几

怎么判断呢   找到它  往后扫ht递减sum+=它   跟K判判

注意等于 加一 之类的各种坑爹细节

要死..

//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=;
int n,cntA[N],cntB[N],A[N],B[N],rk[N],sa[N],tsa[N],ht[N],T,K;
long long sum[N],sum1[N];
char s[N];
void SA(){
for(int i=;i<=n;i++)cntA[s[i]]++;
for(int i=;i<=;i++)cntA[i]+=cntA[i-];
for(int i=n;i;i--)sa[cntA[s[i]]--]=i;
rk[sa[]]=;
for(int i=;i<=n;i++)rk[sa[i]]=rk[sa[i-]]+(s[sa[i]]!=s[sa[i-]]);
for(int l=;rk[sa[n]]<n;l<<=){
memset(cntA,,sizeof(cntA));
memset(cntB,,sizeof(cntB));
for(int i=;i<=n;i++)cntA[A[i]=rk[i]]++,cntB[B[i]=(i+l<=n?rk[i+l]:)]++;
for(int i=;i<=n;i++)cntA[i]+=cntA[i-],cntB[i]+=cntB[i-];
for(int i=n;i;i--)tsa[cntB[B[i]]--]=i;
for(int i=n;i;i--)sa[cntA[A[tsa[i]]]--]=tsa[i];
rk[sa[]]=;
for(int i=;i<=n;i++)rk[sa[i]]=rk[sa[i-]]+(A[sa[i]]!=A[sa[i-]]||B[sa[i]]!=B[sa[i-]]);
}
for(int i=,j=;i<=n;i++){
j=j?j-:;
while(s[i+j]==s[sa[rk[i]-]+j])j++;
ht[rk[i]]=j;
}
}
void print(int l,int r){for(int i=l;i<=r;i++)putchar(s[i]);}
bool check(int p){
int tempans=,l=,r=n;
while(l<=r){
int mid=(l+r)>>;
if(sum[mid]>=p)r=mid-;
else tempans=mid+,l=mid+;
}
int hi=p-sum[tempans-]+ht[tempans],tot=hi+sum1[tempans-];
if(tot>=K)return ;
for(int i=tempans+;i<=n;i++){
hi=min(hi,ht[i]);
if(!hi)break;
tot+=hi;
if(tot>=K)return ;
}return ;
}
void solve(){
for(int i=,t;i<=n;i++,K-=t){
t=n-sa[i]-ht[i]+;
if(K<=t){print(sa[i],sa[i]+K-+ht[i]);return;}
}puts("-1");
}
signed main(){
scanf("%s%d%d",s+,&T,&K),n=strlen(s+),SA();
if(!T)solve();
else{
for(int i=;i<=n;i++)sum[i]=sum[i-]+n-ht[i]-sa[i]+,sum1[i]=sum1[i-]+n-sa[i]+;
if(sum1[n]<K){puts("-1");return ;}
int l=,r=K+,ans;
while(l<=r){
int mid=(l+r)>>;
if(check(mid))ans=mid,r=mid-;
else l=mid+;
}K=ans;solve();
}
}

最新文章

  1. WinCE非通用调试工具汇总
  2. 强连通 HDU 1269
  3. 【翻译】Netscaler真实表现性能调整
  4. socket 连接,使得地址马上可以重用
  5. hdu 3518(后缀数组)
  6. Android设置选项开发及自定义Preference样式
  7. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷
  8. IE6 下 输入类型表单控件背景问题
  9. 201521123100 《Java程序设计》 第2周学习总结
  10. php提供的对称加密算法
  11. SoftEther
  12. js文档就绪函数
  13. VO和DO转换(三) Dozer
  14. 【Android】Android 中string-array的用法
  15. s标签s:if和s:set实现一个表格显示为多个表格
  16. Spark记录-scala快速入门
  17. Knockout: 让ViewModel从htm中剥离出去。
  18. 浅谈main(),int main(),void main(),int main(void)四者之间的区别
  19. Oracle学习操作(5)触发器
  20. java并发编程中CountDownLatch和CyclicBarrier的使用

热门文章

  1. LINUX驱动、系统底层
  2. 洛谷 2476 [SCOI2008]着色方案
  3. 洛谷 4251 [SCOI2015]小凸玩矩阵
  4. 3.8.5 多重选择:switch语句
  5. vue组件知识总结
  6. git常见操作---由简入深
  7. 为什么说Ubuntu的运行级别为2
  8. new出来的对象无法调用@Autowired注入的Spring Bean
  9. Tomcat PK Resin
  10. Android简单开发之 通用Adapter ViewHolder