P3975-[TJOI2015]弦论【SAM】
正题
题目链接:https://www.luogu.com.cn/problem/P3975
题目大意
给一个字符串sss和t,kt,kt,k。求字符串sss第kkk大的子串。
- 当T=0T=0T=0时,相同的子串算一个
- 当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】相关推荐
- luogu P3975 [TJOI2015]弦论 SAM
luogu P3975 [TJOI2015]弦论 链接 bzoj 思路 建出sam. 子串算多个的,统计preant tree的子树大小,否则就是大小为1 然后再统计sam的节点能走到多少串. 然后就 ...
- 洛谷 P3975 [TJOI2015]弦论 解题报告
P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...
- 洛谷 [P3975 [TJOI2015]弦论
洛谷 P3975 [TJOI2015]弦论 题目描述 给定一个长度为 nnn 的字符串,求它的第 kkk 小字串:给定 ttt, ttt 为 000 则表示不同位置的相同子串算作一个,ttt 为 11 ...
- P3975 [TJOI2015]弦论 (SAM)
[TJOI2015]弦论 - 洛谷 感觉位置不同算相同还是比较好想的,我们top排序后算每个点后面连接了多少点就知道里面有多少字串了,然后求k大就行了: 考了位置不同算不同的话,我们就要考虑endpo ...
- 【后缀自动机】Luogu P3975 [TJOI2015]弦论题解
[TJOI2015]弦论 题目描述 为了提高智商,ZJY 开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 nnn 的字符串,求出它的第 ...
- 洛谷P3975 - [TJOI2015]弦论
Portal Description 给出一个小写字母串\(s(|s|\leq5\times10^5),t\in\{0,1\},k(k\leq10^9)\),求\(s\)的第\(k\)小子串.\(t= ...
- [SAM模板题] P3975 [TJOI2015] 弦论
题目思路 对原串建立SAMSAMSAM,然后分情况考虑: t=0t = 0t=0,代表本质不同即为不同,那么我们需要对每个SAMSAMSAM节点uuu维护uuu能够到达的点的数量,即为经过uuu的本质 ...
- P3975 [TJOI2015]弦论 - 后缀自动机(SAM)
这是一道板子题的改编,意在加深对求第k小子串的理解.首先先看一下最简单的SAM板子.相信应该都写过了才会写这题 // // Created by acer on 2021/2/16. // //判断子 ...
- P3975 [TJOI2015]弦论 第K小子串
题目描述 https://www.luogu.org/problem/P3975 为了提高智商,ZJY开始学习弦论.这一天,她在< String theory>中看到了这样一道问题:对于一 ...
- [Luogu P3975] [TJOI2015]弦论
洛谷传送门 BZOJ传送门 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在< String theory>中看到了这样一道问题:对于一个给定的长度为nnn的字符串,求出它的第k& ...
最新文章
- html5拖动图像的关键字,6.7 拖放图像 - HTML5 Canvas 实战
- python 字典操作 内存占用,python - 如何强行释放字典使用的内存? - SO中文参考 - www.soinside.com...
- matlab 二重积分
- linux内核杂记(4)-线程(1)
- 00084_Map接口
- IDEA设置类、方法注释模板
- linux chmod修改权限失败,【Linux】chmod修改文件权限
- flutter GestureDetector 手势处理
- HDU 1870 愚人节的礼物 栈的应用
- 问题2----网速问题?造成的ORA-01034和ORA-27101
- UVa 1252 (状压DP + 记忆化搜索) Twenty Questions
- ssdp java_SSDP协议 - 实施
- 红米android刷机在哪,红米手机怎么刷机 红米手机刷机教程大全
- 登录服务器xp系统,xp系统登入云服务器
- python——自动化报告word(1)
- python计算等差数列_python 等差数列末项计算方式
- 求逆序对数目(合并排序)
- oracle常用分析函数与聚合函数的用法
- 【详解】jupyter 如何添加文字标题
- Android X86 解决ARM兼容的问题
热门文章
- python大于小于_在Python中大于/小于Pandas DataFrames / Series之间的比较
- path manipulation怎么解决_干货!终于!解决macOS下pyenv安装python3.8.2缺少tkinter模块的问题!...
- Java Dao模式通过JDBC连接数据库的操作
- ubuntu14安装python_ubuntu14.04 安装python3.7
- 支持向量回归代码_RDKit:基于支持向量回归(SVR)预测logP
- php正则匹配标点符号,php 正则匹配包含字母、数字以及下划线,且至少包含2种...
- vspythonqt混合_PYQT5 vscode联合操作qtdesigner的方法
- merge函数_c语言中的merge函数
- 三菱plc选型手册_模拟量是什么?PLC和模拟量是如何转换的?
- 算法设计与分析——回溯法——符号三角形问题