P4090[HAOI2016]找相同子串
问题描述
给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。
两个方案不同当且仅当这两个子串中有一个位置不同。
输入格式
两行,两个字符串s1,s2,长度分别为n1,n2。1 <=n1, n2<= 200000,字符串中只有小写字母
输出格式
输出一个整数表示答案
样例输入
aabb
bbaa
样例输出
10
首先看看简洁优美的自动机做法。
将两个串中间加个字符,连起来建机子。
其实只需要在求Right集合大小的时候把他拆成两部分,一部分是第一个子串的Right,另一部分是第二个的。然后每个点求和,即$Ans=\sum v_1[x] \times v_2[x] \times (Max[x]-Max[pra[x]])$
代码:
1 |
|
然后再来看看卡到GG的后缀数组搞法。
利用单调性可以搞成线性的,然而为了方便当然是线段树。
两个串连起来建好机子,倒起讨论,用线段树维护一下当前Height值的数量即可。
注意到相同子串个数恰是LCP之和。
代码:
1 |
|