1. 程式人生 > >【POI 2010】反對稱 Antisymmetry

【POI 2010】反對稱 Antisymmetry

分析 $1 我們 中間 不同 ash hash 字符 子串

題目:

對於一個 $0/1$ 字符串,如果將這個字符串 $0$ 和 $1$ 取反後,再將整個串反過來和原串一樣,就稱作「反對稱」字符串。比如 $00001111$ 和 $010101$ 就是反對稱的,而 $1001$ 就不是。
現在給出一個長度為 $n$ 的 $0/1$ 字符串,求它有多少個子串是反對稱的,註意這裏相同的子串出現在不同的位置會被重復計算。

$n\le 5\times 10^5$

分析:

①顯然,反對稱字符串的長度一定是偶數。

因為若不是偶數,中間的那個數取反永遠不會等於自己。

②若有串$S[x-l+1,\;x+l]$是反對稱字符串,那麽$\forall k \le l,\;S[x-k+1,\;x+k]$也是反對稱字符串。

所以,我們可以直接二分$l$,然後使用$\rm Hash$判斷字符串是否相等即可。

代碼細節較多,我還沒寫出來。

【POI 2010】反對稱 Antisymmetry