Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=1e6+7;
- int len[N];
- int to[N][26];
- int fa[N];
- int siz[N];
- int tot;
- inline int NewNode(int l,int *tr,int su){
- ++tot;
- len[tot]=l;
- if(tr!=NULL)memcpy(to[tot],tr,26<<2);
- fa[tot]=su;
- return tot;
- }
- inline int insert(int u,int c){
- int t=NewNode(len[u]+1,NULL,0);
- for(;u&&!to[u][c];u=fa[u])to[u][c]=t;
- if(!u){
- fa[t]=1;
- return t;
- }
- int v=to[u][c];
- if(len[v]==len[u]+1){
- fa[t]=v;
- return t;
- }
- int x=NewNode(len[u]+1,to[v],fa[v]);
- fa[t]=fa[v]=x;
- for(;u&&to[u][c]==v;u=fa[u])to[u][c]=x;
- return t;
- }
- int t,k;
- ll sum[N];
- int ord[N];
- int cnt[N];
- char s[N];
- int main(){
- scanf("%s",s);
- int n=strlen(s);
- int lst=NewNode(0,NULL,0);
- for(int i=0;i<n;++i){
- siz[lst=insert(lst,s[i]-'a')]=1;
- }
- for(int i=1;i<=tot;++i)cnt[len[i]]++;
- for(int i=1;i<=n;++i)cnt[i]+=cnt[i-1];
- for(int i=1;i<=tot;++i)ord[cnt[len[i]]--]=i;
- r(t),r(k);
- if(t){
- for(int i=tot;i>1;--i){
- int x=ord[i];
- siz[fa[x]]+=siz[x];
- }
- siz[1]=0;
- }
- else {
- for(int i=2;i<=tot;++i){
- siz[i]=1;
- }
- }
- for(int i=tot;i;--i){
- int x=ord[i];
- sum[x]=siz[x];
- for(int j=0;j<26;++j){
- sum[x]+=sum[to[x][j]];
- }
- }
- if(sum[1]<k)puts("-1");
- else {
- int u=1;
- while(k>0){
- for(int i=0;i<26;++i){
- if(sum[to[u][i]]<k)k-=sum[to[u][i]];
- else {
- u=to[u][i];
- putchar(i+'a');
- k-=siz[u];
- break;
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment