洛谷 P3975 [TJOI2015]弦论 解题报告
P3975 [TJOI2015]弦论
题目描述
为了提高智商,ZJY开始学习弦论。这一天,她在《String theory》中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求出它的第\(k\)小子串是什么。你能帮帮她吗?
输入输出格式
输入格式:
第一行是一个仅由小写英文字母构成的字符串\(s\)
第二行为两个整数\(t\)和\(k\),\(t\)为\(0\)则表示不同位置的相同子串算作一个,\(t\)为\(1\)则表示不同位置的相同子串算作多个。\(k\)的意义见题目描述。
输出格式:
输出数据仅有一行,该行有一个字符串,为第\(k\)小的子串。若子串数目不足\(k\)个,则输出\(-1\)。
说明
数据范围
对于\(10\%\)的数据,\(n ≤ 1000\)。
对于\(50\%\)的数据,\(t = 0\)。
对于\(100\%\)的数据,\(n ≤ 5 × 10^5, t < 2, k ≤ 10^9\)。
建立后缀自动机,按要求统计每个状态的贡献。
然后在自动机上(非par树)统计一下后缀数量,根据后缀数量进入后面的节点,得到的一条路径即为答案
Code:
#include <cstdio>
#include <cstring>
const int N=1e6+10;
char s[N];
int t,k,n,tax[N],A[N];
int len[N],ch[N][26],siz[N],par[N],sum[N],tot=1,las=1;
void extend(int c)
{int now=++tot,p=las;len[now]=len[p]+1,siz[now]=1;while(p&&!ch[p][c]) ch[p][c]=now,p=par[p];if(!p) par[now]=1;else{int x=ch[p][c];if(len[x]==len[p]+1) par[now]=x;else{int y=++tot;len[y]=len[p]+1,par[y]=par[x];memcpy(ch[y],ch[x],sizeof ch[x]);while(p&&ch[p][c]==x) ch[p][c]=y,p=par[p];par[now]=par[x]=y;}}las=now;
}
int main()
{scanf("%s%d%d",s+1,&t,&k);n=strlen(s+1);for(int i=1;i<=n;i++) extend(s[i]-'a');for(int i=1;i<=tot;i++) ++tax[len[i]];for(int i=1;i<=n;i++) tax[i]+=tax[i-1];for(int i=1;i<=tot;i++) A[tax[len[i]]--]=i;for(int i=tot;i;i--){if(t) siz[par[A[i]]]+=siz[A[i]];else siz[A[i]]=1;}siz[1]=0;for(int i=tot;i;i--){sum[A[i]]=siz[A[i]];for(int c=0;c<26;c++)sum[A[i]]+=sum[ch[A[i]][c]];}if(sum[1]<k) return puts("-1"),0;int now=1;while(k>0){int c=0;while(k>sum[ch[now][c]]) k-=sum[ch[now][c++]];putchar(c+'a');now=ch[now][c];k-=siz[now];}return 0;
}
2019.1.7
转载于:https://www.cnblogs.com/butterflydew/p/10231548.html
洛谷 P3975 [TJOI2015]弦论 解题报告相关推荐
- 洛谷 [P3975 [TJOI2015]弦论
洛谷 P3975 [TJOI2015]弦论 题目描述 给定一个长度为 nnn 的字符串,求它的第 kkk 小字串:给定 ttt, ttt 为 000 则表示不同位置的相同子串算作一个,ttt 为 11 ...
- 洛谷P3975 - [TJOI2015]弦论
Portal Description 给出一个小写字母串\(s(|s|\leq5\times10^5),t\in\{0,1\},k(k\leq10^9)\),求\(s\)的第\(k\)小子串.\(t= ...
- 洛谷 - P3975 [TJOI2015]弦论(后缀自动机)
题目链接:点击查看 题目大意:给出一个字符串 s,再给出一次询问,询问分为两种类型: 0 k:如果不同位置的相同子串算作一个,求第 k 小的子串 1 k:如果不同位置的相同子串算作多个,求第 k 小的 ...
- 洛谷P3975 [TJOI2015]弦论
链接 点击跳转 题解 后缀自动机上每条路径都是一个子串 对于t=0t=0t=0,实际上是统计字典序第kkk小的子串,自下向上进行一个dpdpdp就可以解决这个问题 对于t=1t=1t=1,每条路径都被 ...
- [洛谷P3975][TJOI2015]弦论
题目大意:求一个字符串的第$k$大字串,$t$表示长得一样位置不同的字串是否算多个 题解:$SAM$,先求出每个位置可以到达多少个字串($Right$数组),然后在转移图上$DP$,若$t=1$,初始 ...
- bzoj3998/洛谷3975 [TJOI2015]弦论 (后缀自动机)
bzoj3998/洛谷3975 [TJOI2015]弦论 题意:求第 k 小字串 方法:先建立SAM,和上一题一样按照拓扑序求出size(表示这个串出现的次数).这道题我们需要求第 k 小,所以我们还 ...
- 洛谷_3975 [TJOI2015]弦论(后缀自动机)
[TJOI2015]弦论 题目链接:https://www.luogu.com.cn/problem/P3975 题解: 对于T==0,只需要构造自动机,将每个状态节点的cnt设为1,然后DFS即可. ...
- 洛谷1056 排座椅 解题报告
洛谷1056 排座椅 本题地址: http://www.luogu.org/problem/show?pid=1056 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头 ...
- 洛谷1067 多项式输出 解题报告
洛谷1067 多项式输出 本题地址: http://www.luogu.org/problem/show?pid=1067 题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i ...
最新文章
- 阿里P7/P8学习路线图——技术封神之路
- Flask框架(SQLAlchemy(python3版本)中修改数据的方法和删除数据 的方法)
- 常见优化Sql查询性能的方法收集
- axios 中文文档、使用说明
- 胃癌2019csco指南_2019 CSCO胃癌诊疗指南精华来了!
- .NET MVC Scripts.Render 上下文不存在问题解决方法
- QMessageBox改变大小
- POJ 3125 Printer Queue(队列,水题)
- JavaScript(3):JS和Html
- Notepad2替换windows自带记事本
- 2009年的MACBOOK苹果电脑重装MAC OS 10.8.5系统
- DOS命令的英文全称
- Lead-follower因子:新闻共现股票收益的关联性研究
- UNCTF2022 部分writeup
- 网路安全之HTTP状态码
- 返回const指针与返回const引用区别
- CSS-精灵图片的使用(从一张图片中截图指定位置图标)
- Android studio入门到精通实例实验
- inputStream(mark函数的应用)
- sklearn的决策树和随即森林的demo