Bzoj3998: [TJOI2015]弦论
题面
传送门
Sol
\(sam\)
求一个串的不重复的第\(k\)小子串很好办
如果可以相同
那么要算上每个点(前缀)的后缀的个数
那么就是这个\(endpos(right)\)集合的子串的出现次数
# include <bits/stdc++.h>
# define IL inline
# define RG register
# define Fill(a, b) memset(a, b, sizeof(a))
# define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
using namespace std;
typedef long long ll;IL int Input(){RG int x = 0, z = 1; RG char c = getchar();for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);return x * z;
}const int maxn(1e6 + 5);int trans[26][maxn], fa[maxn], len[maxn], tot = 1, last = 1;
int n, f[maxn], t[maxn], id[maxn], g[maxn];
char s[maxn];IL void Extend(RG int c){RG int p = last, np = ++tot; last = tot;len[np] = len[p] + 1, g[np] = 1;while(p && !trans[c][p]) trans[c][p] = np, p = fa[p];if(!p) fa[np] = 1;else{RG int q = trans[c][p];if(len[q] == len[p] + 1) fa[np] = q;else{RG int nq = ++tot;len[nq] = len[p] + 1, fa[nq] = fa[q];for(RG int i = 0; i < 26; ++i) trans[i][nq] = trans[i][q];fa[q] = fa[np] = nq;while(p && trans[c][p] == q) trans[c][p] = nq, p = fa[p];}}
}IL void Calc(RG int k){RG int nw = 1;if(k <= f[nw]){while(k > 0){for(RG int i = 0; i < 26; ++i){RG int p = trans[i][nw];if(p){if(k > 0 && k <= f[p]){k -= g[p], putchar(i + 'a'), nw = p;break;}else k -= f[p];}}}}else printf("-1");puts("");
}int main(RG int argc, RG char* argv[]){scanf(" %s", s), n = strlen(s);for(RG int i = 0; i < n; ++i) Extend(s[i] - 'a');for(RG int i = 1; i <= tot; ++i) ++t[len[i]];for(RG int i = 1; i <= tot; ++i) t[i] += t[i - 1];for(RG int i = 1; i <= tot; ++i) id[t[len[i]]--] = i;if(Input()){for(RG int i = tot; i; --i)if(fa[id[i]]) g[fa[id[i]]] += g[id[i]];f[1] = 0;for(RG int i = tot; i; --i){f[id[i]] = g[id[i]];for(RG int j = 0; j < 26; ++j) f[id[i]] += f[trans[j][id[i]]];}}else{for(RG int i = 1; i <= tot; ++i) f[i] = 1, g[i] = 1;for(RG int i = tot; i; --i)for(RG int j = 0; j < 26; ++j) f[id[i]] += f[trans[j][id[i]]];}Calc(Input());return 0;
}
转载于:https://www.cnblogs.com/cjoieryl/p/8901644.html
Bzoj3998: [TJOI2015]弦论相关推荐
- [BZOJ3998][TJOI2015]弦论
[BZOJ3998][TJOI2015]弦论 试题描述 对于一个给定长度为N的字符串,求它的第K小子串是什么. 输入 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不 ...
- BZOJ3998 TJOI2015弦论(后缀数组+二分答案)
先看t=1的情况.显然得求出SA(因为我不会SAM).我们一位位地确定答案.设填到了第len位,二分这一位填什么之后,在已经确定的答案所在的范围(SA上的某段区间)内二分,找到最后一个小于当前串的后缀 ...
- BZOJ3998: [TJOI2015]弦论(后缀自动机,Parent树)
Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...
- bzoj3998 [TJOI2015]弦论
后缀自动机 我们建出后缀自动机,对于每个节点我们算出他和他的后继结点一共可以形成多少个不同的串,不同根据t来定义 这里我们不需要考虑每个节点代表的那些等价类字符串,因为那些字符串不同的前缀在到达这个节 ...
- bzoj3998/洛谷3975 [TJOI2015]弦论 (后缀自动机)
bzoj3998/洛谷3975 [TJOI2015]弦论 题意:求第 k 小字串 方法:先建立SAM,和上一题一样按照拓扑序求出size(表示这个串出现的次数).这道题我们需要求第 k 小,所以我们还 ...
- 洛谷 P3975 [TJOI2015]弦论 解题报告
P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...
- P3975 [TJOI2015]弦论 (SAM)
[TJOI2015]弦论 - 洛谷 感觉位置不同算相同还是比较好想的,我们top排序后算每个点后面连接了多少点就知道里面有多少字串了,然后求k大就行了: 考了位置不同算不同的话,我们就要考虑endpo ...
- 洛谷P3975 - [TJOI2015]弦论
Portal Description 给出一个小写字母串\(s(|s|\leq5\times10^5),t\in\{0,1\},k(k\leq10^9)\),求\(s\)的第\(k\)小子串.\(t= ...
- 洛谷_3975 [TJOI2015]弦论(后缀自动机)
[TJOI2015]弦论 题目链接:https://www.luogu.com.cn/problem/P3975 题解: 对于T==0,只需要构造自动机,将每个状态节点的cnt设为1,然后DFS即可. ...
最新文章
- getBytes等空指针异常
- Linux常用开发环境软件-Redis安装(docker环境下)
- Jmeter参数化的理解
- 彻底搞定C指针---指向指针的指针(转)
- Linux操作系统下的多线程编程详细解析----条件变量
- 交通银行软件中心编制_智能运维国家标准编制启动会在京举行 云智慧参与标准制定...
- R packages for big data:data.table
- HTML5期末大作业:网页设计作业网站设计——千与千寻-电影图文(9页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
- 写给准备用mcafee8.5i企业版的朋友
- json转xml、xml转json
- 网络编程之POP3协议邮箱收信
- 发布源码及依赖到网络maven仓库
- matlab拉丁方,基于拉丁方的流密码算法设计与仿真
- mui ajax 下拉,mui下拉菜单
- 如何下载全球范围的谷歌卫星地图数据
- 统计学的那些冷门思考(各种检验+中心极限)
- VMware设置虚拟机与物理主机处于同一网段,桥接模式
- AlexNet模型及代码详解
- 远光九天云平台 自主创新助力科技自强
- Ajax实现网页部分更新