yicongli

CC-KILLKTH

Apr 10th, 2019
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 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.     char gc;x=0;
  12.     while(!isdigit(c))gc;
  13.     while(isdigit(c))x=x*10+c-'0',gc;
  14. }
  15.  
  16. const int N=4e5+7;
  17.  
  18. char s[N];
  19. int pos[N];
  20. int G[N][26];
  21. int tot;
  22. int len[N],trans[N][26],fa[N];
  23. int cnt[N],ord[N];
  24. ll siz[N];
  25. ll sum[N];
  26.  
  27. inline int Extend(int u,int c,int id){
  28.     int t=++tot;
  29.     siz[t]=1;
  30.     len[t]=len[u]+1;
  31.     pos[t]=id;
  32.     while(u&&!trans[u][c])trans[u][c]=t,u=fa[u];
  33.     if(!u){
  34.         fa[t]=1;
  35.         return t;
  36.     }
  37.     int v=trans[u][c];
  38.     if(len[v]==len[u]+1){
  39.         fa[t]=v;
  40.         return t;
  41.     }
  42.     int x=++tot;
  43.     fa[x]=fa[v];
  44.     len[x]=len[u]+1;
  45.     pos[x]=pos[v];
  46.     memcpy(trans[x],trans[v],26<<2);
  47.     fa[v]=fa[t]=x;
  48.     while(u&&trans[u][c]==v)trans[u][c]=x,u=fa[u];
  49.     return t;
  50. }
  51.  
  52. int dfn;
  53. int ptn[N];
  54.  
  55. void dfs(int x){
  56.     ptn[++dfn]=x;
  57.     sum[dfn]=siz[x]*(len[x]+len[fa[x]]+1)*(len[x]-len[fa[x]])/2;
  58.     for(int i=0;i<26;++i)if(G[x][i])dfs(G[x][i]);
  59. }
  60.  
  61. inline char query(ll k){
  62.     int l=1,r=tot,ans;
  63.     while(l<=r){
  64.         int mid=(l+r)>>1;
  65.         if(sum[mid]<k)ans=mid,l=mid+1;
  66.         else r=mid-1;
  67.     }
  68.     k-=sum[ans];
  69.     int x=ptn[ans+1];
  70.     l=len[fa[x]],r=len[x];
  71.     while(l<=r){
  72.         int mid=(l+r)>>1;
  73.         if(siz[x]*(mid+len[fa[x]]+1)*(mid-len[fa[x]])/2<k)ans=mid,l=mid+1;
  74.         else r=mid-1;
  75.     }
  76.     k-=siz[x]*(ans+len[fa[x]]+1)*(ans-len[fa[x]])/2;
  77.     k=(k-1)%(ans+1)+1;
  78.     return s[pos[x]+k-1];
  79. }
  80.  
  81. int main(){
  82.     scanf("%s",s+1);
  83.     int n=strlen(s+1);
  84.     int lst=++tot;
  85.     for(int i=n;i>=1;--i){
  86.         lst=Extend(lst,s[i]-'a',i);
  87.     }
  88.     for(int i=1;i<=tot;++i)cnt[len[i]]++;
  89.     for(int i=1;i<=n;++i)cnt[i]+=cnt[i-1];
  90.     for(int i=1;i<=tot;++i)ord[cnt[len[i]]--]=i;
  91.     for(int i=tot;i>=1;--i)siz[fa[ord[i]]]+=siz[ord[i]];
  92.     for(int i=1;i<=tot;++i)G[fa[i]][s[pos[i]+len[fa[i]]]-'a']=i;
  93.     dfs(1);
  94.     for(int i=1;i<=tot;++i)sum[i]+=sum[i-1];
  95.     int q;r(q);
  96.     ll g=0;
  97.     while(q--){
  98.         ll p,m;r(p),r(m);
  99.         p=p*g%m;
  100.         char t=query(p+1);
  101.         g+=t;
  102.         // int k;r(k);
  103.         // char t=query(k+1);
  104.         printf("%c\n",t);
  105.     }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment