题解
知识点:
后缀数组,LCP,单调栈
分析:
要求两个串的子串相同的个数,在两个串上不是很好求。所以我们转换成一个串,把两个串连接成一个字符串,我们要求两个串的后缀的前缀相同的个数(而且这两个位置必须得来自两个不同的串,当然这个只是一个简单的判断而已)。
把串连接起来之后,做两遍单调栈,分别枚举前面的对后面的做的贡献。而两遍单调栈分别以A串和B串作为主元(哪个为主,前缀和贡献的时候就算哪一个,而在代码中的贡献判断就算另一个)。
这样整个过程的时间复杂度是$O(n\log_{2}n)$的。
代码:
1 |
|
顺便讲一讲罗穗骞的论文中讲到的眼神问题,如果规定要求的答案是两个串的长度大于等于$k$的子串的个数,那么在单调栈前还要做一些改动,就是将height值按照能不能大于等于$k$进行分组,分完组之后,贡献就只能在组内算,不能算外面的(因为那些长度都不够)。详情见论文。