给定一个字符串,求本质不同排名第k小的子串

Solution

后缀自动机上每条路径对应一个本质不同的子串

按照 TRANS 图的拓扑序,DP 计算出每个点发出多少条路径

(注意区别 TRANS 图的拓扑序和后缀链接的拓扑序)

然后暴力 26 分询问即可

#include <bits/stdc++.h>
using namespace std;
const int Maxn = 2000005;
struct Suffix_Automata {
int maxlen[Maxn], trans[Maxn][26], link[Maxn], Size, Last;
int t[Maxn], a[Maxn], cnt[Maxn], f[Maxn];
Suffix_Automata() { Size = Last = 1; }
inline void Extend(int id) {
int cur = (++ Size), p;
maxlen[cur] = maxlen[Last] + 1;
cnt[cur] = 1;
for (p = Last; p && !trans[p][id]; p = link[p]) trans[p][id] = cur;
if (!p) link[cur] = 1;
else {
int q = trans[p][id];
if (maxlen[q] == maxlen[p] + 1) link[cur] = q;
else {
int clone = (++ Size);
maxlen[clone] = maxlen[p] + 1;
for(int i=0;i<26;i++) trans[clone][i] = trans[q][i];
link[clone] = link[q];
for (; p && trans[p][id] == q; p = link[p]) trans[p][id] = clone;
link[cur] = link[q] = clone;
}
}
Last = cur;
}
void CalcEndposSize() {
memset(t, 0, sizeof t);
for(int i=1; i<=Size; i++) t[maxlen[i]]++;
for(int i=1; i<=Size; i++) t[i]+=t[i-1];
for(int i=1; i<=Size; i++) a[t[maxlen[i]]--]=i;
/*for(int i=Size; i>=1; --i) cnt[link[a[i]]]+=cnt[a[i]];
cnt[1] = 0;*/
}
void DFS(int p) {
for(int i=0;i<26;i++) {
if(trans[p][i]) {
if(f[trans[p][i]]==0) DFS(trans[p][i]);
f[p]+=f[trans[p][i]];
}
}
f[p]+=cnt[p];
}
void Go(int p,int k) {
k-=cnt[p];
for(int i=0;i<26 && k>0;i++) {
if(trans[p][i]) {
if(f[trans[p][i]]>=k) {
cout<<(char)(i+'a');
Go(trans[p][i],k);
return;
}
else {
k-=f[trans[p][i]];
}
}
}
}
} sam; int main() {
ios::sync_with_stdio(false);
string str;
cin>>str;
int t,k;
for(int i=0;i<str.length();i++)
sam.Extend(str[i]-'a');
sam.CalcEndposSize();
for(int i=2; i<=sam.Size; i++)
sam.cnt[i] = 1;
sam.DFS(1);
cin>>t;
while(t--) {
cin>>k;
sam.Go(1,k);
cout<<endl;
}
}

最新文章

  1. jquery_DOM笔记2
  2. jquery改变链接移上光标时的颜色实例
  3. Inverted sentences
  4. android 合并两个jar包
  5. 扩展:gridview 空数据时显示表头
  6. Memcached(五)Memcached的并发实例
  7. HTML5 Canvas实现刮刮卡效果实例
  8. mockito学习笔记
  9. EasyUI的下拉选择框控件方法被屏蔽处理方式
  10. jQuery选择器(添加节点及删除节点及克隆及替换及包装)第九节
  11. B+索引、Hash索引、数据类型长度
  12. CSS3美化网页元素
  13. 增量会话对象——DeltaSession
  14. 【转】shell脚本中如何传入参数
  15. Java 开源博客 Solo 1.9.0 发布 - 新皮肤
  16. CopyOnWriteArrayList&amp;Collections.synchronizedList()
  17. man 命令帮助文件输出乱码
  18. day5_函数_判断小数
  19. eclipse对maven项目进行打war包
  20. Direct I/O,Synchronous I/O的概念

热门文章

  1. jmeter新手学习笔记(一)
  2. HDU_4570_区间dp
  3. ARTS Week 9
  4. 51nod 1133 不重叠的线段 (贪心,序列上的区间问题)
  5. kendo ui 好用的小部件--grid
  6. css中flex布局
  7. 在yum安装lamp的环境下安装coreseek以及php的sphinx扩展
  8. JVM性能优化系列-(4) 编写高效Java程序
  9. multitask learning 相关论文资源
  10. [转]java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?