$S$与$T$长度至少为$k$的公共子串个数。
套路坑定合并两个字符串,中间加上奇怪的字符(保证不会有前缀一边属于$S$,一边属于$T$),生成后缀数组。
对于一个$height[i]>=k$属于$S$串的后缀,统计比他排名小的有多少符合条件的$T$串。字串个数=$(lcp-k+1)$
对于他排名大的有多少符合条件的$T$串,可以通过$height[i]>=k$属于$T$串的后缀,统计比他排名小的有多少符合条件的$S$串。发现同样算法。
实现
利用栈,每次有新的元素加入,判断是否为$T$串:$sum+=hight[i]-k+1$。
当压入栈的$height\leq s[top]$,栈内所有$\geq height$的元素都需要弹出来,$sum-=(height-s.val)*s.num,s.num$表示栈内$s.val$有多少个。当压入栈中位$S$串的时候累加进答案即可。
代码
1 |
|