Description

input

output

Data Constraint

Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read()
{
char ch = getchar();
int res = 0;
while(!isdigit(ch))
ch = getchar();
while(isdigit(ch))
res = (res << 3) + (res << 1) + (ch ^ 48),ch = getchar();
return res;
}
const int N = 500005;
struct node
{
int len,link,nxt[27];
};
node st[N << 1];
int tot,op,f[N << 1],t[N << 1],g[N << 1],k,siz[N << 1],last,ans;
char a[N];
inline void init()
{
last = tot = 1;
}
inline void sa_extend(int c)
{
int cur = ++tot,p = last;
last = cur;
st[cur].len = st[p].len + 1,siz[cur] = 1;
for(;p&&!st[p].nxt[c];p = st[p].link)
st[p].nxt[c] = cur;
if(!p)
st[cur].link = 1;
else
{
int q = st[p].nxt[c];
if(st[p].len + 1 == st[q].len)
st[cur].link = q;
else
{
int clo = ++tot;
st[clo] = st[q];
st[clo].len = st[p].len+1;
for(;p&&st[p].nxt[c] == q;p = st[p].link)
st[p].nxt[c] = clo;
st[q].link = st[cur].link = clo;
}
}
}
int main()
{
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
scanf("%s",a + 1),init();
int len = strlen(a + 1);
for(int i = 1;i <= len;i++)
sa_extend(a[i]-'a');
op = read(),k = read();
for(int i = 1;i <= tot;i++)
t[st[i].len]++;
for(int i = 1;i <= tot;i++)
t[i] += t[i - 1];
for(int i = 1;i <= tot;i++)
g[t[st[i].len]--] = i;
if(op)
{
for(int i = tot;i;i--)
siz[st[g[i]].link] += siz[g[i]];
}
else
for(int i = tot;i;i--)
siz[g[i]] = 1;
siz[1] = 0;
for(int i = tot;i;i--)
{
f[g[i]] = siz[g[i]];
for(int j = 0;j < 26;j++)
{
if(st[g[i]].nxt[j])
f[g[i]] += f[st[g[i]].nxt[j]];
}
}
if(k > f[1])
{
cout << -1;
return 0;
}
int now = 1;
k -= siz[now];
while(k)
{
int p = 0;
while(k > f[st[now].nxt[p]])
k -= f[st[now].nxt[p]],++p;
now = st[now].nxt[p],putchar('a'+p),k -= siz[now];
}
}