T=0 做法同此题, T=1 我也在那道题里说过了。
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 500005
using namespace std;
char s[N];
int len[N<<1],r[N<<1],f1[N<<1],f2[N<<1],cc[N<<1],fa[N<<1],q[N<<1];
int ch[N<<1][26];
int S,n,cnt,last;
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
inline void insert(int c)
{
int p=last,np=last=++cnt;
len[np]=len[p]+1; r[np]=1;
while (p&&!ch[p][c]) ch[p][c]=np,p=fa[p];
if (!p) fa[np]=S;
else
{
int q=ch[p][c];
if (len[p]+1==len[q]) fa[np]=q;
else
{
int nq=++cnt;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
len[nq]=len[p]+1;
fa[nq]=fa[q]; fa[q]=fa[np]=nq;
while (p&&ch[p][c]==q) ch[p][c]=nq,p=fa[p];
}
}
}
inline void dp(int T,int k,int *f)
{
int p=1;
while (k>r[p])
{
for (int i=0;i<26;i++)
if (ch[p][i])
{
if (f[ch[p][i]]>=k)
{
putchar(i+'a');
k-=r[p];
p=ch[p][i];
break;
}
else k-=f[ch[p][i]];
}
}
}
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
S=last=++cnt;
for (int i=1;i<=n;i++)
insert(s[i]-'a');
for (int i=1;i<=cnt;i++) ++cc[len[i]];
for (int i=1;i<=n;i++) cc[i]+=cc[i-1];
for (int i=1;i<=cnt;i++) q[cc[len[i]]--]=i;
for (int i=cnt;i;i--)
r[fa[q[i]]]+=r[q[i]];
r[1]=0;
for (int i=cnt;i;i--)
{
if (q[i]!=1) f1[q[i]]=1,f2[q[i]]=r[q[i]];
for (int j=0;j<26;j++)
f1[q[i]]+=f1[ch[q[i]][j]],f2[q[i]]+=f2[ch[q[i]][j]];
}
int type=read(),k=read();
if (type==0)
{
for (int i=2;i<=cnt;i++) r[i]=1;
if (k>f1[S]) puts("-1");
else dp(type,k,f1);
}
else
{
if (k>f2[S]) puts("-1");
else dp(type,k,f2);
}
return 0;
}