建立后缀树(即反序插入字符串的parent树),然后可以发现按照dfs序排列满足其反串按字典序从小到大排列,那么就可以维护出每一刻子树的串长和,然后直接在dfs序上二分确定节点,再在节点内部乱搞即可求出答案。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define ll long long
5 int V,last,ans,a[N<<1],sz[N<<1],mi[N<<1],id[N<<1],len[N<<1],fa[N<<1],ch[N<<1][31];
6 ll k,mod,l[N<<1],sum[N<<1];
7 char s[N];
8 void add(int c){
9 int p=last,np=last=++V;
10 len[np]=len[p]+1;
11 sz[np]=1;
12 for(;(p)&&(!ch[p][c]);p=fa[p])ch[p][c]=V;
13 if (!p)fa[np]=1;
14 else{
15 int q=ch[p][c];
16 if (len[q]==len[p]+1)fa[np]=q;
17 else{
18 int nq=++V;
19 len[nq]=len[p]+1;
20 memcpy(ch[nq],ch[q],sizeof(ch[q]));
21 fa[nq]=fa[q];
22 fa[np]=fa[q]=nq;
23 for(;(p)&&(ch[p][c]==q);p=fa[p])ch[p][c]=nq;
24 }
25 }
26 }
27 void dfs(int k){
28 a[++a[0]]=k;
29 for(int i=0;i<26;i++)
30 if (ch[k][i])dfs(ch[k][i]);
31 }
32 int main(){
33 int t;
34 scanf("%s%d",s,&t);
35 V=last=1;
36 int n=strlen(s);
37 for(int i=n-1;i>=0;i--)add(s[i]-'a');
38 for(int i=1;i<=V;i++)a[len[i]]++;
39 for(int i=1;i<=n;i++)a[i]+=a[i-1];
40 for(int i=1;i<=V;i++)id[a[len[i]]--]=i;
41 for(int i=1,j=n;i<=V;i++)
42 if (sz[i])mi[i]=--j;
43 memset(a,0,sizeof(a));
44 for(int i=V;i;i--){
45 sz[fa[id[i]]]+=sz[id[i]];
46 mi[fa[id[i]]]=mi[id[i]];
47 }
48 for(int i=V;i;i--)l[i]=(len[fa[i]]+len[i]+1LL)*(len[i]-len[fa[i]])/2*sz[i];
49 memset(ch,0,sizeof(ch));
50 for(int i=1;i<=V;i++)ch[fa[i]][s[mi[i]+len[fa[i]]]-'a']=i;
51 dfs(1);
52 for(int i=1;i<=V;i++)sum[i]=sum[i-1]+l[a[i]];
53 while (t--){
54 scanf("%lld%lld",&k,&mod);
55 k=k*ans%mod+1;
56 int p=lower_bound(sum+1,sum+V+1,k)-sum;
57 k-=sum[p-1];
58 p=a[p];
59 int x=len[fa[p]]+1,y=len[p];
60 while (x<y){
61 int mid=(x+y>>1);
62 if ((mid+len[fa[p]]+1LL)*(mid-len[fa[p]])/2*sz[p]>=k)y=mid;
63 else x=mid+1;
64 }
65 k-=(x+len[fa[p]])*(x-1LL-len[fa[p]])/2*sz[p];
66 printf("%c\n",s[(k-1)%x+mi[p]]);
67 ans+=s[(k-1)%x+mi[p]];
68 }
69 }

最新文章

  1. HTML5之API
  2. 程序代码记Log
  3. sql插入多条数据的sql语句
  4. Poj 1904 King&#39;s Quest 强连通分量
  5. 【Qt】Qt之自定义界面(窗体缩放-跨平台终极版)【转】
  6. Codeforces 161D
  7. VLC网页插件添加对火狐浏览器的支持
  8. JSON 格式化为易读格式的字符串
  9. javac命令详解(上)
  10. Java课程设计-定时器(团队)
  11. mysql中查询的优先级
  12. 自定义redis连接池(字典操作)
  13. groupadd 创建组
  14. Java集合之HashMap源码分析
  15. ElasticSearch Java API
  16. java的配置方式简介
  17. RAID常见问题集锦+底部案例
  18. File FileStream StreamReader StreamWriter C#
  19. cocos lua 加密与解密 混淆 (版本号cocos3.4)
  20. git与pycharm合并,珠联璧合

热门文章

  1. 从零入门 Serverless | 一文详解 Serverless 技术选型
  2. Linear Referencing Tools(线性参考工具)
  3. Boost Started on Windows
  4. JavaScript兼容性汇总
  5. Vim 不区分大小写
  6. VMware虚拟机安装Linux
  7. UltraSoft - Alpha - Scrum Meeting 6
  8. NGINX杂谈——flask_limiter的IP获取(怎么拿到真实的客户端IP)
  9. 攻防世界 杂项13.can_has_stdio?
  10. PCIE学习笔记--TLP Header详解(三)