CF578D口胡
阿新 • • 發佈:2022-03-14
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]\) 為例。
- \(2\leq R-L+1\)
可以發現,如果 \(S[L]=S[L+1]\),那麼這個區間就失去了意義(出現了比 \(S[L-1]\)
對於 \(T[R]\) 的討論,只要讓其不等於 \(S[R]\) 就好了。方案數 \(m-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]]\)
處理一下 \(f,g\),以及 \(g\) 的極長連續段,然後再處理一個 \(f\) 的字首和就可以 \(O(n)\) 了。