#include<cstdio>
#include<algorithm>
#define N 4000005
using namespace std;
int last,cnt,num=0,ans[N];
struct state
{
int len,link,s,siz;
int nxt[30];
};
state st[N];
struct node
{
int val,id;
};
node p[N];
void init()
{
st[0].len=0;
st[0].link=-1;
cnt=last=0;
}
void extend(int c)
{
int cur=++cnt;
st[cur].siz=1;
st[cur].len=st[last].len+1;
int p=last;
while (p!=-1&&!st[p].nxt[c])
{
st[p].nxt[c]=cur;
p=st[p].link;
}
if (p==-1) st[cur].link=0; else
{
int q=st[p].nxt[c];
if (st[q].len==st[p].len+1) st[cur].link=q; else
{
int clone=++cnt;
st[clone].len=st[p].len+1;
st[clone].siz=0;
while (p!=-1&&st[p].nxt[c]==q)
{
st[p].nxt[c]=clone;
p=st[p].link;
}
st[q].link=st[cur].link=clone;
}
}
last=cur;
}
bool cmp(node x,node y)
{
return x.val>y.val;
}
void dfs(int u)
{
st[u].s=st[u].siz;
for (int i=0;i<26;i++)
if (st[u].nxt[i])
{
if (!st[st[u].nxt[i]].s) dfs(st[u].nxt[i]);
st[u].s+=st[st[u].nxt[i]].s;
}
}
void find(int u,int k)
{
k-=st[u].siz;
if (k<=0) return;
for (int i=0;i<26;i++)
if (st[u].nxt[i])
{
if (k<=st[st[u].nxt[i]].s)
{
ans[++num]=i;
find(st[u].nxt[i],k);
break;
}
k-=st[st[u].nxt[i]].s;
}
}
int main()
{
init();
char ch=getchar();
while (ch<'a'||ch>'z') ch=getchar();
while (ch>='a'&&ch<='z')
{
extend(ch-'a');
ch=getchar();
}
int t,k;
scanf("%d%d",&t,&k);
if (t==1)
{
for (int i=1;i<=last;i++)
{
p[i].val=st[i].len;
p[i].id=i;
}
sort(p+1,p+last+1,cmp);
for (int i=1;i<=last;i++)
st[st[p[i].id].link].siz+=st[p[i].id].siz;
}
st[0].siz=0;
dfs(0);
if (st[0].s<k)
{
printf("-1\n");
return 0;
}
find(0,k);
for (int i=1;i<=num;i++)
printf("%c",ans[i]+'a');
puts("");
return 0;
}
蒟蒻萌新实在调不出来了qwq
嘤嘤嘤