Advertisement
Guest User

ksir

a guest
Aug 19th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define NMAX 200005
  3. #define MAXLG 24
  4. using namespace std;
  5. ifstream fin("ksir.in");
  6. ofstream fout("ksir.out");
  7.  
  8. long long n, i, j, q, lga, x;
  9. long long DP[MAXLG][NMAX];
  10. long long pozitie[NMAX], suma[NMAX], lung[NMAX];
  11.  
  12. string str;
  13. struct elem
  14. {
  15.     long long nr1, nr2, ind;
  16. }l[NMAX];
  17. bool comp(const elem &a,const elem &b)
  18. {
  19.     if(a.nr1==b.nr1)
  20.         return a.nr2<b.nr2;
  21.     return a.nr1<b.nr1;
  22. }
  23. int main()
  24. {
  25.  
  26.     fin>>str;
  27.     n=str.size();
  28.     for(int i=0;i<n;i++)
  29.         DP[0][i]=str[i];
  30.     for(lga=1;(1<<lga)<n;lga++)
  31.     {
  32.         for(j=0;j<n;j++)
  33.         {
  34.             l[j].ind=j;
  35.             l[j].nr1=DP[lga-1][j];
  36.             if(j+(1<<(lga-1))<n)
  37.                 l[j].nr2=DP[lga-1][j+(1<<(lga-1))];
  38.             else l[j].nr2=-1;
  39.         }
  40.         sort(l,l+n,comp);
  41.         for(j=0;j<n;j++)
  42.             if(j && l[j].nr1==l[j-1].nr1 && l[j].nr2==l[j-1].nr2)
  43.                 DP[lga][l[j].ind]=DP[lga][l[j-1].ind];
  44.             else DP[lga][l[j].ind]=j;
  45.     }
  46.     lga--;
  47.     for(int i=0;i<n;i++)
  48.         pozitie[DP[lga][i]]=i;
  49.     int k=0;
  50.     vector<int>rang(n+5,0);
  51.     for(int i=0;i<n;i++)
  52.        rang[pozitie[i]]=i;
  53.     lung[0]=0;
  54.     for(int i=0; i<n; i++, k ? k-- : 0)
  55.     {
  56.         if(rang[i]==n-1)
  57.         {
  58.             k=0;
  59.             continue;
  60.         }
  61.         int j=pozitie[rang[i]+1];
  62.         while(i+k<n && j+k<n && str[i+k]==str[j+k])
  63.             k++;
  64.         lung[rang[i]+1]=k;
  65.     }
  66.     suma[0]=n-pozitie[0];
  67.     for(i=1;i<n;i++)
  68.         suma[i]=suma[i-1]+(n-pozitie[i]-lung[i]);
  69.     fin>>q;
  70.     while(q--)
  71.     {
  72.         fin>>x;
  73.         int lg=lower_bound(suma,suma+n,x)-suma;
  74.         for(j=0,i=pozitie[lg];j<x-suma[lg-1]+lung[lg];i++,j++)
  75.             fout<<str[i];
  76.         fout<<'\n';
  77.     }
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement