我们先求出该字符串的\(SA\)和\(Ht\)

然后分类讨论

\(T=0\)时,每次去掉\(Ht\)往后扫就行

\(T=1\)时,我们考虑\(lcp\)对答案的影响

既然用到\(lcp\),那就要用\(ST\)表维护

左端点固定时,随右端点的增大,区间\(\min\)单调不升

我们就可以用二分+限制右端点的方式统计某个后缀的前缀的贡献

循环遍历每个后缀时,由于\(Ht\)部分已经统计过对答案的贡献,就不用再计算了,从\(Ht+1\)的位置继续向后统计即可

#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
using namespace std;const int MAXN=5e5+5;int ln,maxn,p,t;
int SA[MAXN],id[MAXN],rnk[MAXN],bnk[MAXN],Ht[MAXN];
char ch[MAXN];
int ST[19][MAXN],lg[MAXN];void shel()
{for(int i=1;i<=ln;++i) ++bnk[rnk[id[i]]];for(int i=1;i<=maxn;++i) bnk[i]+=bnk[i-1];for(int i=1;i<=ln;++i) SA[++bnk[rnk[id[i]]-1]]=id[i];for(int i=0;i<=maxn;++i) bnk[i]=0;return;
}void GetSA()
{for(int i=1;i<=ln;++i) rnk[i]=ch[i],id[i]=i,maxn=max(maxn,rnk[i]);shel();for(int k=1;k<ln;k<<=1){for(int i=1;i<=k;++i) id[i]=ln-k+i;int ct=k;for(int i=1;i<=ln;++i) if(SA[i]>k) id[++ct]=SA[i]-k;shel();swap(id,rnk);rnk[SA[1]]=1;for(int i=2;i<=ln;++i) rnk[SA[i]]=(id[SA[i]]==id[SA[i-1]]&&id[SA[i]+k]==id[SA[i-1]+k])?rnk[SA[i-1]]:rnk[SA[i-1]]+1;if(rnk[SA[ln]]==ln) return;maxn=rnk[SA[ln]];}return;
}void GetHt()
{int k=0;for(int i=1;i<=ln;++i){if(rnk[i]==1) continue;if(k) --k;int ct=SA[rnk[i]-1];while(ct+k<=ln&&i+k<=ln&&ch[i+k]==ch[ct+k]) ++k;Ht[rnk[i]]=k;}return;
}int Getmi(int l,int r){int tmp=lg[r-l+1];return min(ST[tmp][l+(1<<tmp)-1],ST[tmp][r]);}void slv1()
{for(int i=1;i<=ln;++i) lg[i]=i>>lg[i-1]+1?lg[i-1]+1:lg[i-1];for(int i=1;i<=ln;++i) ST[0][i]=Ht[i];for(int j=1;j<=lg[ln];++j){int tmp=1<<j-1;for(int i=tmp<<1;i<=ln;++i){ST[j][i]=min(ST[j-1][i],ST[j-1][i-tmp]);}}for(int i=1;i<=ln;++i){int tmp=SA[i]+Ht[i];int ct=ln;while(1){if(tmp>ln) break;if(ct==i){if(t>ln-tmp+1){t-=ln-tmp+1;break;}for(int j=SA[i];j<=tmp+t-1;++j) putchar(ch[j]);return;}int l=i,r=ct;while(l<r){int mid=l+r+1>>1;if(Getmi(i+1,mid)>=tmp-SA[i]+1) l=mid;else r=mid-1;}ct=r;if(t>r-i+1) t-=r-i+1;else{for(int j=SA[i];j<=tmp;++j) putchar(ch[j]);return;}++tmp;}}puts("-1");return;
}void slv2()
{int ct=1;while(t>ln-SA[ct]-Ht[ct]+1) t-=ln-SA[ct]-Ht[ct]+1,++ct;if(ct>ln){puts("-1");return;}for(int i=SA[ct];i<=SA[ct]+t+Ht[ct]-1;++i) putchar(ch[i]);puts("");return;
}int main()
{scanf("%s",ch+1);ln=strlen(ch+1);GetSA();GetHt();scanf("%d%d",&p,&t);p?slv1():slv2();return 0;
}

转载于:https://www.cnblogs.com/AH2002/p/10223659.html

[TJOI2015]弦论相关推荐

  1. [BZOJ3998][TJOI2015]弦论

    [BZOJ3998][TJOI2015]弦论 试题描述 对于一个给定长度为N的字符串,求它的第K小子串是什么. 输入 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不 ...

  2. 洛谷 P3975 [TJOI2015]弦论 解题报告

    P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...

  3. P3975 [TJOI2015]弦论 (SAM)

    [TJOI2015]弦论 - 洛谷 感觉位置不同算相同还是比较好想的,我们top排序后算每个点后面连接了多少点就知道里面有多少字串了,然后求k大就行了: 考了位置不同算不同的话,我们就要考虑endpo ...

  4. 洛谷P3975 - [TJOI2015]弦论

    Portal Description 给出一个小写字母串\(s(|s|\leq5\times10^5),t\in\{0,1\},k(k\leq10^9)\),求\(s\)的第\(k\)小子串.\(t= ...

  5. 洛谷_3975 [TJOI2015]弦论(后缀自动机)

    [TJOI2015]弦论 题目链接:https://www.luogu.com.cn/problem/P3975 题解: 对于T==0,只需要构造自动机,将每个状态节点的cnt设为1,然后DFS即可. ...

  6. 洛谷 [P3975 [TJOI2015]弦论

    洛谷 P3975 [TJOI2015]弦论 题目描述 给定一个长度为 nnn 的字符串,求它的第 kkk 小字串:给定 ttt, ttt 为 000 则表示不同位置的相同子串算作一个,ttt 为 11 ...

  7. bzoj3998/洛谷3975 [TJOI2015]弦论 (后缀自动机)

    bzoj3998/洛谷3975 [TJOI2015]弦论 题意:求第 k 小字串 方法:先建立SAM,和上一题一样按照拓扑序求出size(表示这个串出现的次数).这道题我们需要求第 k 小,所以我们还 ...

  8. 【后缀自动机】Luogu P3975 [TJOI2015]弦论题解

    [TJOI2015]弦论 题目描述 为了提高智商,ZJY 开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 nnn 的字符串,求出它的第 ...

  9. luogu P3975 [TJOI2015]弦论 SAM

    luogu P3975 [TJOI2015]弦论 链接 bzoj 思路 建出sam. 子串算多个的,统计preant tree的子树大小,否则就是大小为1 然后再统计sam的节点能走到多少串. 然后就 ...

  10. [Luogu P3975] [TJOI2015]弦论

    洛谷传送门 BZOJ传送门 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在< String theory>中看到了这样一道问题:对于一个给定的长度为nnn的字符串,求出它的第k& ...

最新文章

  1. 文件bookDetails.html,查看源码: BookShopping.rar_bookdetails.jsp - VerySource
  2. 5个经典的JavaScript面试题
  3. 怎样调整vim分屏窗口的宽度和高度?
  4. net core WebApi——使用xUnits来实现单元测试
  5. matlab 移动平均_两所高校被禁用MATLAB背后,是工业设计能力之争
  6. 论文学习14-End-to-End Relation Extraction using LSTMs on Sequences and Tree Structures(端到端实体关系抽取)
  7. 网页挂码方式html css,CSS代码 解决网页挂马问题
  8. pythonexcel最好得库_Python操作Excel,你觉得哪个库更好呢?
  9. SQLite数据库的特性
  10. 随想录(rtos和一般os的区别)
  11. spring连接mysql出现问题_spring+hibernate连接mysql问题啊
  12. CentOS6.8 x86_64bit安装nginx-1.6.2
  13. yii2 加载css,js
  14. 下载的****.ts格式的视频在迅雷播放器中无法播放
  15. new 关键字做的事
  16. 批量修改所选文件夹中所有文件的名称
  17. JDE 系统表(标准表)
  18. png变成矢量图_ps中如何在将图转换成矢量图
  19. simulink积分器报错
  20. 有哪些常用的虚拟主机管理系统

热门文章

  1. 字节跳动面试锦集(二):项目HR高频面试总结
  2. 传时珍医药伟业谱本草科学新篇——访李时珍医药集团董事长林朝辉
  3. 对字符串按“红黄蓝”进行排序,如“蓝黄红红黄”,输出结果为“红红黄黄蓝”
  4. 使用VS+VisualGDB编译Linux版本RCF
  5. Paypal国际版网站集成
  6. 能预防及治疗癌症?哈佛研发出可侦测基因缺陷的人工智能系统
  7. Exponetial BackOff(指数退避算法)
  8. 直播视频流+html,前端页面播放 rtmp 流与 flv 格式视频文件
  9. gui开头的歌词_以“去”开头的一句歌词
  10. Ubuntu18.04上传文件夹到github