分两个子问题。如果只算一次,那直接dag上动规就行。
如果多算,就在插入的时候打个endsize=1。我是在准备的时候弄得。先fail树上endsize累加起来。注意1的endsize不能要。然后再dag上动规。
不用建出这些树,因为长度大的一定在底层,所以从大到小处理即可。
记得搜索的时候减去自己这个串的贡献。
#include<bits/stdc++.h>
using namespace std;
#define in read()
int in{
int cnt=0,f=1;char ch=0;
while(!isdigit(ch)){
ch=getchar();if(ch=='-')f=-1;
}
while(isdigit(ch)){
cnt=cnt*10+ch-48;
ch=getchar();
}return cnt*f;
}
struct node{
int ch[26],len,fail,endsize,size;
}t[1000003];int cnt=1,last=1;
void insert(char s){
int x=s-'a';int p=last;int now;last=now=++cnt;t[now].len=t[p].len+1;//t[now].endsize=1;
for(;p&&!t[p].ch[x];p=t[p].fail)t[p].ch[x]=now;
if(!p)t[now].fail=1;
else{
int q=t[p].ch[x];if(t[q].len==t[p].len+1)t[now].fail=q;
else{
int tem=++cnt;t[tem]=t[q];t[tem].len=t[p].len+1;t[q].fail=t[now].fail=tem;
for(;p&&t[p].ch[x]==q;p=t[p].fail)t[p].ch[x]=tem;
}
}
}
char ch[500003];int a,b;int len;
vector<int> q[1000003];
void pre0(){
for(int i=1;i<=cnt;i++)t[i].size=1,q[t[i].len].push_back(i);
for(int i=len;i>=0;i--){
for(int j=0;j<q[i].size();j++){
int k=q[i][j];
for(int l=0;l<26;l++){
if(t[k].ch[l])t[k].size+=t[t[k].ch[l]].size;
}
}
}
}
void dfs0(int u,int k){
if(--k==0)return;
for(int i=0;i<26;i++){
if(t[u].ch[i]){
if(t[t[u].ch[i]].size>=k){
putchar(i+'a');dfs0(t[u].ch[i],k);break;
}else k-=t[t[u].ch[i]].size;
}
}
}
void pre1(){
int now=1;for(int i=1;i<=len;i++){
now=t[now].ch[ch[i]-'a'];
t[now].endsize++;
}
for(int i=1;i<=cnt;i++)q[t[i].len].push_back(i);
for(int i=len;i>=0;i--){
for(int j=0;j<q[i].size();j++){
int k=q[i][j];
t[t[k].fail].endsize+=t[k].endsize;
}
}t[1].endsize=0;
for(int i=1;i<=cnt;i++)t[i].size=t[i].endsize;t[1].size=t[1].endsize=0;
for(int i=len;i>=0;i--){
for(int j=0;j<q[i].size();j++){
int k=q[i][j];
for(int l=0;l<26;l++){
if(t[k].ch[l]){
t[k].size+=t[t[k].ch[l]].size;
}
}
}
}
}
void dfs1(int u,int k){//cout<<u<<" "<<t[u].endsize<<" "<<k<<endl;
if((k-=t[u].endsize)<=0)return;
for(int i=0;i<26;i++){
//cout<<t[u].ch[i]<<endl;
if(t[u].ch[i]){//cout<<t[t[u].ch[i]].size<<endl;
if(k<=t[t[u].ch[i]].size){
putchar(i+'a');dfs1(t[u].ch[i],k);break;
}else k-=t[t[u].ch[i]].size;
}
}
}
int main(){
scanf("%s",ch+1);len=strlen(ch+1);
for(int i=1;i<=len;i++)insert(ch[i]);
// for(int i=1;i<=cnt;i++)cout<<i<<" "<<t[i].fail<<endl;
a=in;b=in;
if(!a){
pre0();
if(t[1].size<b)cout<<"-1";else{
dfs0(1,b+1);
}
}else{
pre1();
if(t[1].size<b)cout<<"-1";else{
dfs1(1,b);
}
}
return 0;
}