RT.
代码如下
#include<cstdio>
#include<cstring>
using namespace std;
const int o=1e6+10;
int t,k,n,cnt,h[o];char s[o];long long sz[o],f[o];bool vis[o];
struct Edge{int v,p;}e[o];
inline void ad(int U,int V){e[++cnt].v=V;e[cnt].p=h[U];h[U]=cnt;}
struct SAM{
int len[o],lk[o],lst,ch[o][26];
inline void init(){lk[lst=len[0]=0]=-1;}
inline void ins(char c){
int cur=++cnt,p,q;len[cur]=len[lst]+1;c-=97;sz[cur]=1;
for(p=lst,lst=cur;p+1&&!ch[p][c];p=lk[p]) ch[p][c]=cur;
if(p==-1){lk[cur]=0;return;}
if(len[p]+1==len[q=ch[p][c]]){lk[cur]=q;return;}
int cln=++cnt;
len[cln]=len[p]+1;lk[cln]=lk[q];for(int i=0;i<26;++i) ch[cln][i]=ch[q][i];
for(lk[q]=lk[cur]=cln;p+1&&ch[p][c]==q;p=lk[p]) ch[p][c]=cln;
}
}sam;
void dfs(int nw){for(int i=h[nw];i;i=e[i].p) dfs(e[i].v),sz[nw]+=sz[e[i].v];}
void dp(int nw){if(vis[nw]) return;vis[nw]=1;f[nw]=sz[nw];for(int i=0;i<26;++i) if(sam.ch[nw][i]) dp(sam.ch[nw][i]),f[nw]+=f[sam.ch[nw][i]];}
void print(int nw,long long ss){
if((ss=ss+sz[nw])>=k) return;
for(int i=0;i<26;++i) if(sam.ch[nw][i])
if(ss+f[sam.ch[nw][i]]>=k){putchar(i+97);print(sam.ch[nw][i],ss);return;}
else ss+=f[sam.ch[nw][i]];
}
int main(){
scanf("%s%d%d",s+1,&t,&k);n=strlen(s+1);
sam.init();for(int i=1;i<=n;++i) sam.ins(s[i]);
for(int j=cnt,i=1|(cnt=0);i<=j;++i) ad(sam.lk[i],i);
if(t) dfs(0);
dp(sz[0]=0);
if(f[0]<k){printf("-1");return 0;}
print(0,0);
return 0;
}