1. 程式人生 > 其它 >CF578D口胡

CF578D口胡

LCS 為給定串的長度減一,考慮列舉一個區間 \([L,R]\),表示 \(S\)\(T\) 的長度為 \(L-1\) 的字首完全相同以及長度為 \(n-R\) 的字尾完全相同,且沒有比這個字首和字尾更長的字首和字尾。

可以發現對於一組 \([L,R]\),滿足條件的串還需要滿足 \(S[L+1,R]=T[L,R-1]\)\(S[L,R-1]=T[L+1,R]\)。證明顯而易見。

對於兩種情況分別討論。因為兩種情況沒有區別,這裡以 \(S[L+1,R]=T[L,R-1]\) 為例。

  1. \(2\leq R-L+1\)

可以發現,如果 \(S[L]=S[L+1]\),那麼這個區間就失去了意義(出現了比 \(S[L-1]\)

\(T[L-1]\) 更長的字首),可以直接開潤。

對於 \(T[R]\) 的討論,只要讓其不等於 \(S[R]\) 就好了。方案數 \(m-1\) 種。

  1. \(L=R\)

無論如何方案數一定是 \(m-1\)

需要注意的是,如果出現了 \(S[L+1,R]=T[L,R-1]\)\(S[L,R-1]=T[L+1,R]\) 同時滿足的情況,需要減掉。

注意到這種情況滿足 \(S[x-1]=T[x]=S[x+1]\)

例子:\(S=aba,T=bab\),基本上直接統計就好了。得到了一個 \(O(n^2)\) 的做法。

\(f[n]=[S[n]\neq S[n+1]],g[n]=[S[n-1]=S[n+1]]\)

,那麼答案是:

\[\sum_{l=1}^{n-1}f[l](\sum_{r=l+1}^{n}m-1)+\sum_{r=2}^{n}f[r-1](\sum_{l=1}^{r-1}m-1)+(m-1)\times n-\sum_{l=1}^{n-2}f[l]\sum_{r=l+2}^{n}f[r]\times\prod_{x=l+1}^{r-1}g[x] \]

處理一下 \(f,g\),以及 \(g\) 的極長連續段,然後再處理一個 \(f\) 的字首和就可以 \(O(n)\) 了。