[题目链接 \(Click\) \(Here\)](P3975 [TJOI2015]弦论)

题目大意:

  • 重复子串不算的第\(k\)大子串

  • 重复子串计入的第\(k\)大子串

写法:后缀自动机。

和\(OI\) \(Wiki\)上介绍的写法不太一样,因为要同时解决两个问题。

把字符串每个前缀所在等价类的\(siz\)记为\(1\),然后在\(parent\) \(tree\)上跑一次统计,就可以求出来每一个等价类在串中出现的次数。这里采用类似后缀排序的方法,对字符串按\(len\)为关键字进行排序。至于经过每个点的路径数\(sum\),可以在\(Trie\)边上对后面节点的\(sum\)(=每一个等价类在串中出现次数)求和得到(初始值等于\(siz\),因为每个点还有不选的情况)。

不要忘了把\(siz[1]\)和\(sum[1]\)清空!

#include <bits/stdc++.h>
using namespace std; const int N = 1100010; char s[N];
int las = 1, node = 1;
int fa[N], len[N], siz[N], ch[N][26]; void extend (int c) {
register int p, q, x, y;
p = las, q = ++node; las = q;
len[q] = len[p] + 1; siz[q] = 1;
while (p != 0 && ch[p][c] == 0) {
ch[p][c] = q;
p = fa[p];
}
if (p == 0) {
fa[q] = 1;
} else {
x = ch[p][c];
if (len[x] == len[p] + 1) {
fa[q] = x;
} else {
y = ++node;
fa[y] = fa[x];
fa[x] = fa[q] = y;
len[y] = len[p] + 1;
memcpy (ch[y], ch[x], sizeof (ch[x]));
while (p != 0 && ch[p][c] == x) {
ch[p][c] = y;
p = fa[p];
}
}
}
} int t, k, nd[N], bin[N]; long long sum[N]; void output (int u) {
if (k <= siz[u]) return;
k -= siz[u];
register int i;
for (i = 0; i < 26; ++i) {
if (ch[u][i]) {
if (k > sum[ch[u][i]]) {
k -= sum[ch[u][i]];
} else {
printf ("%c", i + 'a');
output (ch[u][i]);
return;
}
}
}
} int main () {
scanf ("%s %d %d", s, &t, &k);
register int i, j, n;
n = strlen (s);
for (i = 0; i < n; ++i) extend (s[i] - 'a');
for (i = 1; i <= node; ++i) bin[len[i]]++;
for (i = 1; i <= node; ++i) bin[i] += bin[i - 1];
for (i = 1; i <= node; ++i) nd[bin[len[i]]--] = i;
for (i = node; i >= 1; --i) siz[fa[nd[i]]] += siz[nd[i]];
for (i = 1; i <= node; ++i) t == 0 ? (sum[i] = siz[i] = 1) : (sum[i] = siz[i]);
siz[1] = sum[1] = 0;
for (i = node; i >= 1; --i) {
for (j = 0; j < 26; ++j) {
if (ch[nd[i]][j]) {
sum[nd[i]] += sum[ch[nd[i]][j]];
}
}
}
if (sum[1] < k) {
puts ("-1");
} else {
output (1);
}
}

\(p.s\)关于后缀数组求第一问的方法:

枚举每一个后缀,第i个后缀对答案的贡献为\(len−sa[i]+1−height[i]\)。

Luogu P3975 [TJOI2015]弦论的更多相关文章

  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]弦论

    思路 一眼SAM板子,结果敲了一中午... 我还是太弱了 题目要求求第k小的子串 我们可以把t=0当成t=1的特殊情况,(所有不同位置的相同子串算作一个就是相当于把所有子串的出现位置个数(endpos ...

  4. [洛谷P3975][TJOI2015]弦论

    题目大意:求一个字符串的第$k$大字串,$t$表示长得一样位置不同的字串是否算多个 题解:$SAM$,先求出每个位置可以到达多少个字串($Right$数组),然后在转移图上$DP$,若$t=1$,初始 ...

  5. 并不对劲的bzoj3998:loj2102:p3975:[TJOI2015]弦论

    题目大意 对于一个给定的长度为n(\(n\leq5*10^5\))的字符串, 分别求出不同位置的相同子串算作一个.不同位置的相同子串算作多个时,它的第k(\(k\leq10^9\))小子串是什么 题解 ...

  6. BZOJ 3998: [TJOI2015]弦论 [后缀自动机 DP]

    3998: [TJOI2015]弦论 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2152  Solved: 716[Submit][Status] ...

  7. 【BZOJ 3998】 3998: [TJOI2015]弦论 (SAM )

    3998: [TJOI2015]弦论 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2627  Solved: 881 Description 对于一 ...

  8. [Luogu 3973] TJOI2015 线性代数

    [Luogu 3973] TJOI2015 线性代数 这竟然是一道最小割模型. 据说是最大权闭合子图. 先把矩阵式子推出来. 然后,套路建模就好. #include <algorithm> ...

  9. 【BZOJ3998】[TJOI2015]弦论 后缀自动机

    [BZOJ3998][TJOI2015]弦论 Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T ...

随机推荐

  1. Bootstrap之信息记录

    Bootstrap中文网: http://www.bootcss.com/ 上面有一些资料和范例 实例精选: https://v3.bootcss.com/getting-started/#examp ...

  2. Reversing-x64Elf-100

    一道很简单的小题 作为python小白这道题主要是学习了一点python知识...... 可以看出来 sub_4006FD 这个函数是用来判断输入密码是否正确的 我们看一下它的伪代码: signed ...

  3. html5 autoplay不起作用 Uncaught (in promise) DOMException: play() failed because the user didn't interac

    chrome://flags/#autoplay-policy

  4. U68641 划水(swim.pas/c/cpp)

    U68641 划水(swim.pas/c/cpp) 题目背景 小小迪带你划水. 题目描述 原题 输入输出格式 输入格式: 第一行一个数 T. 接下来 T 行每行一个数表示 n 输出格式: 输出 T 行 ...

  5. codeforces659C

    Tanya and Toys CodeForces - 659C In Berland recently a new collection of toys went on sale. This col ...

  6. codeforces630C

    Lucky Numbers CodeForces - 630C 小希称只含7和8的数是幸运数,那么不超过n位的幸运数有多少个? Input 一个整数 n (1 ≤ n ≤ 55) Output 输出幸 ...

  7. linux shell系列9 统计用户的权限

    #!/bin/bash #set -x host=`hostname` ip=`ifconfig $(ip a|grep eth|head -n1|awk -F: '{print $2}') |gre ...

  8. BZOJ2127happiness——最小割

    题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...

  9. WIN8.1下Prolific USB-to-Serial Comm Port驱动黄色感叹号问题

    文章解决来源:http://blog.csdn.net/gsj0791/article/details/17664861 在做fpga口的uart回环测试时候,由于开发板上的是usb转uart,所以需 ...

  10. 【转】让浏览器格式化显示JSON数据之chrome jsonView插件安装

    jsonView 用来让Chrome浏览器能格式化的显示JSON数据. 以上是网上找的方式,且试验成功! 步骤: 1.打开 https://github.com : 2.搜索 jsonView 链接: ...