题目描述
传送门
题意:给定两个字符串 A 和 B ,求长度不小于 k 的公共子串的个数(可以相同)。
题解
首先把一个串接在另一个串的后面,中间放一个没出现过的字符。
由于每一个子串都是某一个后缀的前缀,求出sa和height了之后,我们可以将height分组,组内都是height>=k的后缀。可以知道长度不小于k的公共子串是两个后缀的前缀,并且它们一定在同一组内。
那么对于每一组,从前往后扫,假设遇到了A的后缀,那么统计一下它前面与B的后缀能组成多少>=k的公共子串,然后再把A和B反一下,这样扫两遍,就求出了答案。
关键是怎么统计。暴力统计是 O(n2) 的肯定不行。我们知道两个后缀的最长公共前缀是它们的区间最小值,所以可以维护一个自底向上单调递增的栈。同时需要维护的是,栈中的总和已经栈中每一个元素的出现次数。需要注意的是,只有需要统计的一种后缀的