[TyvjP1515] 子串统计 [luoguP2408] 不同子串个数(后缀数组)
Tyvj传送门
luogu传送门
经典题
统计一个字符串中不同子串的个数
一个字符串中的所有子串就是所有后缀的前缀
先求出后缀数组,求出后缀数组中相邻两后缀的 lcp
那么按照后缀数组中的顺序遍历求解
每一个后缀 suffix(sa[i]) 对于答案的贡献为 len sa[i] height[i]
len sa[i] 为当前后缀的长度,也就是当前后缀所有前缀的个数(字符串从 0 开始)
height[i] 就是相邻两后缀 lcp,因为有可能会有相同前缀,而相同前缀在前面已经计算过了
为什么只需要 height 数组,而不用把任意两后缀的 lcp 求出来呢?
因为所有后缀已经按照字典序排序了,也就是说,sa[i] 和 sa[i 1] 的 lcp 即为 sa[i] 和 sa[0 ~ i 1] 的所有 lcp 的最大值。
——代码(Tyvj)
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define N 200001 5 #define LL long long 6 7 LL ans; 8 int len, m = 256; 9 int buc[N], x[N], y[N], sa[N], rank[N], height[N]; 10 char s[N]; 11 12 inline void build_sa() 13 35 } 36 37 inline void build_height() 38 49 } 50 51 int main() 52 61 build_sa(); 62 build_height(); for(i = 0; i < len; i++) ans += (LL)(len sa[i] height[i]); 64 printf("%lld\n", ans); 65 return 0; 66 }View Code
洛谷那题好像数据有点问题。
上一篇:[CODEVS1915] 分配问题(最小费用最大流)
下一篇:[POJ1611]The Suspects(并查集)
后缀数组
pla文件怎么看,pla文件用什么打开?
pl1文件怎么看,pl1文件用什么打开?
pl文件怎么看,pl文件用什么打开?
pl0文件怎么看,pl0文件用什么打开?
pkt文件怎么看,pkt文件用什么打开?
pkm文件怎么看,pkm文件用什么打开?
pks文件怎么看,pks文件用什么打开?
pka文件怎么看,pka文件用什么打开?
pkh文件怎么看,pkh文件用什么打开?
pkg文件怎么看,pkg文件用什么打开?