正题

题目链接:https://www.luogu.com.cn/problem/P3975


题目大意

给一个字符串sss和t,kt,kt,k。求字符串sss第kkk大的子串。

  1. 当T=0T=0T=0时,相同的子串算一个
  2. 当T=1T=1T=1时,不同位置的相同子串算不同的串

解题思路

当T=0T=0T=0时很简单,对于每个位置求该位置开始能到多少个串即可,也就是fx=∑x−>y(fy+1)f_x=\sum_{x->y}(f_y+1)fx​=x−>y∑​(fy​+1)然后根据fxf_xfx​像权值线段树那样走就好了

当T=1T=1T=1时,我们需要求出每个endposendposendpos的大小,因为对于走到该节点的一个子串,显然在该位置的endposendposendpos的集合为结尾也有一个一样的子串,因为每个endposendposendpos包含所有的子节点的endposendposendpos,所以我们对于一个原串的后缀让siz+1siz+1siz+1,之后让每个节点加上它parentsparentsparents树上节点的sizsizsiz就好。

用桶排就可以做到O(n)O(n)O(n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+1;
int n,las,cnt,k,t,c[N],fa[N],sum[N];
int siz[N],ch[N][26],a[N],len[N];
char s[N];
void add(int c){int p=las;int np=las=++cnt;len[np]=len[p]+1;siz[cnt]++;for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;if(!p)fa[np]=1;else{int q=ch[p][c];if(len[p]+1==len[q])fa[np]=q;else{int nq=++cnt;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[nq]));fa[nq]=fa[q];fa[np]=fa[q]=nq;for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;}}return;
}
void solve(int x,int k){if(k<=siz[x])return;k-=siz[x];for(int i=0;i<26;i++){if(!ch[x][i])continue;if(k>sum[ch[x][i]])k-=sum[ch[x][i]];else {printf("%c",i+'a');solve(ch[x][i],k);return;}}return;
}
int main()
{cnt=las=1;scanf("%s",s+1);n=strlen(s+1);for(int i=1;i<=n;i++)add(s[i]-'a');scanf("%d%d",&t,&k);for(int i=1;i<=cnt;i++)c[len[i]]++;for(int i=1;i<=n;i++)c[i]+=c[i-1];for(int i=1;i<=cnt;i++)a[c[len[i]]--]=i;for(int i=cnt;i>=1;i--)siz[fa[a[i]]]+=siz[a[i]];for(int i=1;i<=cnt;i++)t?(sum[i]=siz[i]):(sum[i]=siz[i]=1);siz[1]=siz[0]=sum[1]=sum[0]=0;for(int i=cnt;i>=1;i--)for(int j=0;j<26;j++)if(ch[a[i]][j])sum[a[i]]+=sum[ch[a[i]][j]]; if(sum[1]<k)printf("-1");else solve(1,k);return 0;
}

P3975-[TJOI2015]弦论【SAM】相关推荐

  1. luogu P3975 [TJOI2015]弦论 SAM

    luogu P3975 [TJOI2015]弦论 链接 bzoj 思路 建出sam. 子串算多个的,统计preant tree的子树大小,否则就是大小为1 然后再统计sam的节点能走到多少串. 然后就 ...

  2. 洛谷 P3975 [TJOI2015]弦论 解题报告

    P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...

  3. 洛谷 [P3975 [TJOI2015]弦论

    洛谷 P3975 [TJOI2015]弦论 题目描述 给定一个长度为 nnn 的字符串,求它的第 kkk 小字串:给定 ttt, ttt 为 000 则表示不同位置的相同子串算作一个,ttt 为 11 ...

  4. P3975 [TJOI2015]弦论 (SAM)

    [TJOI2015]弦论 - 洛谷 感觉位置不同算相同还是比较好想的,我们top排序后算每个点后面连接了多少点就知道里面有多少字串了,然后求k大就行了: 考了位置不同算不同的话,我们就要考虑endpo ...

  5. 【后缀自动机】Luogu P3975 [TJOI2015]弦论题解

    [TJOI2015]弦论 题目描述 为了提高智商,ZJY 开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 nnn 的字符串,求出它的第 ...

  6. 洛谷P3975 - [TJOI2015]弦论

    Portal Description 给出一个小写字母串\(s(|s|\leq5\times10^5),t\in\{0,1\},k(k\leq10^9)\),求\(s\)的第\(k\)小子串.\(t= ...

  7. [SAM模板题] P3975 [TJOI2015] 弦论

    题目思路 对原串建立SAMSAMSAM,然后分情况考虑: t=0t = 0t=0,代表本质不同即为不同,那么我们需要对每个SAMSAMSAM节点uuu维护uuu能够到达的点的数量,即为经过uuu的本质 ...

  8. P3975 [TJOI2015]弦论 - 后缀自动机(SAM)

    这是一道板子题的改编,意在加深对求第k小子串的理解.首先先看一下最简单的SAM板子.相信应该都写过了才会写这题 // // Created by acer on 2021/2/16. // //判断子 ...

  9. P3975 [TJOI2015]弦论 第K小子串

    题目描述 https://www.luogu.org/problem/P3975 为了提高智商,ZJY开始学习弦论.这一天,她在< String theory>中看到了这样一道问题:对于一 ...

  10. [Luogu P3975] [TJOI2015]弦论

    洛谷传送门 BZOJ传送门 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在< String theory>中看到了这样一道问题:对于一个给定的长度为nnn的字符串,求出它的第k& ...

最新文章

  1. html5拖动图像的关键字,6.7 拖放图像 - HTML5 Canvas 实战
  2. python 字典操作 内存占用,python - 如何强行释放字典使用的内存? - SO中文参考 - www.soinside.com...
  3. matlab 二重积分
  4. linux内核杂记(4)-线程(1)
  5. 00084_Map接口
  6. IDEA设置类、方法注释模板
  7. linux chmod修改权限失败,【Linux】chmod修改文件权限
  8. flutter GestureDetector 手势处理
  9. HDU 1870 愚人节的礼物 栈的应用
  10. 问题2----网速问题?造成的ORA-01034和ORA-27101
  11. UVa 1252 (状压DP + 记忆化搜索) Twenty Questions
  12. ssdp java_SSDP协议 - 实施
  13. 红米android刷机在哪,红米手机怎么刷机 红米手机刷机教程大全
  14. 登录服务器xp系统,xp系统登入云服务器
  15. python——自动化报告word(1)
  16. python计算等差数列_python 等差数列末项计算方式
  17. 求逆序对数目(合并排序)
  18. oracle常用分析函数与聚合函数的用法
  19. 【详解】jupyter 如何添加文字标题
  20. Android X86 解决ARM兼容的问题

热门文章

  1. python大于小于_在Python中大于/小于Pandas DataFrames / Series之间的比较
  2. path manipulation怎么解决_干货!终于!解决macOS下pyenv安装python3.8.2缺少tkinter模块的问题!...
  3. Java Dao模式通过JDBC连接数据库的操作
  4. ubuntu14安装python_ubuntu14.04 安装python3.7
  5. 支持向量回归代码_RDKit:基于支持向量回归(SVR)预测logP
  6. php正则匹配标点符号,php 正则匹配包含字母、数字以及下划线,且至少包含2种...
  7. vspythonqt混合_PYQT5 vscode联合操作qtdesigner的方法
  8. merge函数_c语言中的merge函数
  9. 三菱plc选型手册_模拟量是什么?PLC和模拟量是如何转换的?
  10. 算法设计与分析——回溯法——符号三角形问题