yicongli

LG3975

Mar 7th, 2019
411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.57 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=1e6+7;
  17.  
  18. int len[N];
  19. int to[N][26];
  20. int fa[N];
  21. int siz[N];
  22.  
  23. int tot;
  24.  
  25. inline int NewNode(int l,int *tr,int su){
  26.     ++tot;
  27.     len[tot]=l;
  28.     if(tr!=NULL)memcpy(to[tot],tr,26<<2);
  29.     fa[tot]=su;
  30.     return tot;
  31. }
  32.  
  33. inline int insert(int u,int c){
  34.     int t=NewNode(len[u]+1,NULL,0);
  35.     for(;u&&!to[u][c];u=fa[u])to[u][c]=t;
  36.     if(!u){
  37.         fa[t]=1;
  38.         return t;
  39.     }
  40.     int v=to[u][c];
  41.     if(len[v]==len[u]+1){
  42.         fa[t]=v;
  43.         return t;
  44.     }
  45.     int x=NewNode(len[u]+1,to[v],fa[v]);
  46.     fa[t]=fa[v]=x;
  47.     for(;u&&to[u][c]==v;u=fa[u])to[u][c]=x;
  48.     return t;
  49. }
  50.  
  51. int t,k;
  52.  
  53. ll sum[N];
  54.  
  55. int ord[N];
  56. int cnt[N];
  57. char s[N];
  58.  
  59. int main(){
  60.     scanf("%s",s);
  61.     int n=strlen(s);
  62.     int lst=NewNode(0,NULL,0);
  63.     for(int i=0;i<n;++i){
  64.         siz[lst=insert(lst,s[i]-'a')]=1;
  65.     }
  66.     for(int i=1;i<=tot;++i)cnt[len[i]]++;
  67.     for(int i=1;i<=n;++i)cnt[i]+=cnt[i-1];
  68.     for(int i=1;i<=tot;++i)ord[cnt[len[i]]--]=i;
  69.     r(t),r(k);
  70.     if(t){
  71.         for(int i=tot;i>1;--i){
  72.             int x=ord[i];
  73.             siz[fa[x]]+=siz[x];
  74.         }
  75.         siz[1]=0;
  76.     }
  77.     else {
  78.         for(int i=2;i<=tot;++i){
  79.             siz[i]=1;
  80.         }
  81.     }
  82.     for(int i=tot;i;--i){
  83.         int x=ord[i];
  84.         sum[x]=siz[x];
  85.         for(int j=0;j<26;++j){
  86.             sum[x]+=sum[to[x][j]];
  87.         }
  88.     }
  89.     if(sum[1]<k)puts("-1");
  90.     else {
  91.         int u=1;
  92.         while(k>0){
  93.             for(int i=0;i<26;++i){
  94.                 if(sum[to[u][i]]<k)k-=sum[to[u][i]];
  95.                 else {
  96.                     u=to[u][i];
  97.                     putchar(i+'a');
  98.                     k-=siz[u];
  99.                     break;
  100.                 }
  101.             }
  102.         }
  103.     }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment