[TJOI2015] 弦论 题解
所有子串,一眼 \(\text{SAM}\)。
从根开始一直往下走,走到任何一个点都代表一个子串。维护 \(sm\) 表示每个子串有几个(\(t=0\) 就当一个),可以用树形 \(dp\) 跳后缀链接树,然后暴力跑 \(\text{SAM}\) 即可。
当然我们发现这样时间复杂度会爆炸,因为第二部分是个 \(TAG\),因此用 \(cnt\) 记录每个节点能走到的所有节点的 \(sm\) 之和,这样就能少判断很多情况。
时间复杂度 \(O(26n)\)。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5;
int k,t,ans[N],len;
struct SAM{
int sm[N],ln[N],sz[N];
int id,tl,tr[N][26],pr[N];
vector<int>g[N];int cnt[N];
SAM(){pr[0]=-1;}
void cpy(int x,int y){
for(int i=0;i<26;i++)
tr[x][i]=tr[y][i];
pr[x]=pr[y];ln[x]=ln[y];
}void add(int x){
ln[++id]=ln[tl]+1;
int p=tl;tl=id;
while(~p&&!tr[p][x])
tr[p][x]=id,p=pr[p];
if(p<0){
sm[tl]++;
return;
}int u=p,v=tr[p][x];
if(ln[u]+1==ln[v]){
pr[id]=v;
sm[tl]++;
return;
}cpy(++id,v);
ln[id]=ln[u]+1;
pr[v]=pr[id-1]=id;
while(~p&&tr[p][x]==v)
tr[p][x]=id,p=pr[p];
sm[tl]++;
}void dfs(int x){
for(int i=0;i<g[x].size();i++)
dfs(g[x][i]),sm[x]+=sm[g[x][i]];
}void find(int x){
if(k<=0) return;
for(int i=0;i<26;i++){
int y=tr[x][i];
if(!y) continue;
if(!cnt[y]){
int p=k;ans[++len]=i;
k-=sm[y];find(y);
if(k<=0) return;
cnt[y]=p-k;len--;
}else if(k<=cnt[y]){
ans[++len]=i;
k-=sm[y];find(y);
return;
}else k-=cnt[y];
}
}void jb(){
for(int i=1;i<=id;i++)
g[pr[i]].push_back(i);
}
}sam;char s[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>s>>t>>k;
for(int i=0;s[i];i++)
sam.add(s[i]-'a');
sam.jb();
if(t) sam.dfs(0);
else for(int i=1;i<=sam.id;i++) sam.sm[i]=1;
sam.find(0);
for(int i=1;i<=len;i++)
cout<<(char)(ans[i]+'a');
return 0;
}//man!what can I say!
[TJOI2015] 弦论 题解的更多相关文章
- 洛谷 P3975 / loj 2102 [TJOI2015] 弦论 题解【后缀自动机】【拓扑排序】
后缀自动机入门. 题目描述 为了提高智商,ZJY 开始学习弦论. 这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 \(n\) 的字符串,求出它的第 \ ...
- BZOJ3998:[TJOI2015]弦论——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3998 https://www.luogu.org/problemnew/show/P3975 对于 ...
- 题解-TJOI2015 弦论
TJOI2015 弦论 字符串 \(s\) 和 \(t\) 和 \(k\).如果 \(t=0\),不同位置的相同子串算 \(1\) 个:如果 \(t=1\),不同位置的相同子串算多个.求 \(k\) ...
- 【BZOJ3998】[TJOI2015]弦论 后缀自动机
[BZOJ3998][TJOI2015]弦论 Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T ...
- bzoj3998: [TJOI2015]弦论(SAM+dfs)
3998: [TJOI2015]弦论 题目:传送门 题解: SAM的入门题目(很好的复习了SAM并加强Right集合的使用) 其实对于第K小的字符串直接从root开始一通DFS就好,因为son边是直接 ...
- BZOJ 3998: [TJOI2015]弦论 [后缀自动机 DP]
3998: [TJOI2015]弦论 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2152 Solved: 716[Submit][Status] ...
- Luogu P3975 [TJOI2015]弦论
题目链接 \(Click\) \(Here\) 题目大意: 重复子串不算的第\(k\)大子串 重复子串计入的第\(k\)大子串 写法:后缀自动机. 和\(OI\) \(Wiki\)上介绍的写法不太一样 ...
- 洛谷 P3975 [TJOI2015]弦论 解题报告
P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...
- 【BZOJ 3998】 3998: [TJOI2015]弦论 (SAM )
3998: [TJOI2015]弦论 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2627 Solved: 881 Description 对于一 ...
- BZOJ_3998_[TJOI2015]弦论_后缀自动机
BZOJ_3998_[TJOI2015]弦论_后缀自动机 Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行 ...
随机推荐
- Echarts 提示组件
1.开启指示器 默认情况下,指示器是关闭状态,如果需要开启,直接配置tooltip字段即可 var option = { tooltip:{}, } 2.指示器的触发类型 触发类型的字段为trigge ...
- MySql 9 in Docker 利用克隆插件搭建主从
环境说明 Docker Windows 11 MySql 9.1.0 搭建步骤 1. 准备主库 准备一个主库的配置文件 master.cnf [mysqld] server-id=1 log-bin= ...
- 将.nuget文件夹从C盘移到其它盘,再也不用担心的C盘爆红了
将.nuget文件夹从C盘移到其它盘,再也不用担心的C盘爆红了 命令 查看缓存文件夹的具体路径 dotnet nuget locals all --list 第一步 在文件资源管理器输入%AppDat ...
- 【服务器安全问题】双防火墙有什么意义?SSH暴力破解如何防范
发现我的服务器有大量的陌生IP尝试SSH登录,似乎想暴力破解. 我个人习惯是服务器提供商开放了所有端口的,同时也没有开启运维软件提供的防火墙emm 这倒是让我想到了 一般服务器提供商(比如阿里云.华为 ...
- 【单片机】初次实验:Keil51的使用
哔哩哔哩/CSDN/博客园:萌狼蓝天 延时器 delay(int count){ int i,j; for(i=0;i<count;i++){ for(j=0;j<1000;j++); } ...
- Windows修改电脑DNS
访问浏览器出现无法访问此页面,找不到DNS地址,则可以通过如下方式修改DNS 按下windows键+R键(两个键一起按) 出现下面窗口 输入control按回车键(Enter键)就会出现下面的窗口 D ...
- shell之变量默认值
{var:-default_value}当var 不存在,或者值为空时,返回default_value name不存在,返回了一个默认值,但是name并没有改变, 后续不可访问 $ set -u # ...
- 重拾 iptables
iptables 是一个常看常忘的命令,本文试图从应用的角度理解它 iptables 是运行在用户空间的应用软件,通过控制 Linux 内核 netfilter 模块,来管理网络数据包的处理和转发 一 ...
- Qt编写跨平台视频监控系统(64通道占用7%CPU/支持win_linux_mac等)
一.前言 视频监控组件经历过数十年的迭代,从最初的只简单播放个rtsp视频流,到现在支持各种音频视频文件格式(mp3.wav.mp4.asf.rm.rmvb.mkv等).支持各种视频流格式(rtp.r ...
- 一问一答学习PyQT6,对比WxPython和PyQt6的差异
在我的基于WxPython的跨平台框架完成后,对WxPython的灵活性以及强大功能有了很深的了解,在跨平台的桌面应用上我突然对PyQt6的开发也感兴趣,于是准备了开发环境学习PyQt 6,并对比下W ...