SP7258 SUBLEX - Lexicographical Substring Search - 后缀自动机,dp
2024-10-06 16:03:03
给定一个字符串,求本质不同排名第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;
}
}
最新文章
- jquery_DOM笔记2
- jquery改变链接移上光标时的颜色实例
- Inverted sentences
- android 合并两个jar包
- 扩展:gridview 空数据时显示表头
- Memcached(五)Memcached的并发实例
- HTML5 Canvas实现刮刮卡效果实例
- mockito学习笔记
- EasyUI的下拉选择框控件方法被屏蔽处理方式
- jQuery选择器(添加节点及删除节点及克隆及替换及包装)第九节
- B+索引、Hash索引、数据类型长度
- CSS3美化网页元素
- 增量会话对象——DeltaSession
- 【转】shell脚本中如何传入参数
- Java 开源博客 Solo 1.9.0 发布 - 新皮肤
- CopyOnWriteArrayList&;Collections.synchronizedList()
- man 命令帮助文件输出乱码
- day5_函数_判断小数
- eclipse对maven项目进行打war包
- Direct I/O,Synchronous I/O的概念
热门文章
- jmeter新手学习笔记(一)
- HDU_4570_区间dp
- ARTS Week 9
- 51nod 1133 不重叠的线段 (贪心,序列上的区间问题)
- kendo ui 好用的小部件--grid
- css中flex布局
- 在yum安装lamp的环境下安装coreseek以及php的sphinx扩展
- JVM性能优化系列-(4) 编写高效Java程序
- multitask learning 相关论文资源
- [转]java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?