我的板子 manacher

2021-10-08 00:07:14 字數 1478 閱讀 1256

給定乙個字串s,找出所有(i,j)使得s[i……j]為回文串。(回文串就是正看倒看都一樣的串)

分該回文串是奇數串還是偶數串,遍歷中心位向兩邊延伸

vector<

int>

d1(n),d2

(n);

for(

int i =

0; i < n; i++

) d2[i]=0

;while(0

<= i - d2[i]-1

&& i + d2[i]

< n &&

s[i - d2[i]-1

]== s[i + d2[i]])

}

和z函式思想一樣

,**也基本一樣,思想就是通過利用之前已求出來的值來計算當前值

奇回文字串

vector<

int>

d1(n)

;for

(int i =

0, l =

0, r =-1

; i < n; i++

) d1[i]

= k--;if

(i + k > r)

}

偶回文字串(假定和第i個相等的字元在i-1的位置)

vector<

int>

d2(n)

;for

(int i =

0, l =

0, r =-1

; i < n; i++

) d2[i]

= k--;if

(i + k > r)

}

我們先做乙個預處理,將原字串每個間隙都用』#'隔開,這樣的話,我們就不用分奇偶兩種情況討論了。比如

原串:a b a b a b c

先串:# a # b # a # b # a # b # c #

設m是原串回文串的長度

當m時奇數時,比如是a b a,這時現回文字串# a # b # a #的長度要比原回文字串的長度大m+1(多了#的個數),所以現回文字串的長度是2*m+1,是奇數。

當m時偶數時,比如是a b b a,這時現回文字串# a # b # b a #的長度還是比原回文字串的長度大m+1(多了#的個數),所以現回文字串的長度是2*m+1,還是奇數。

總之,現回文字串的長度會一直是奇數,可以直接按分奇偶處理時的奇數法處理

//預處理

stirng s,str;cin>>s;

int len=s.

size()

;for

(int i=

0;i<=

2*len;

++i)

我的多項式全家桶板子

博主最近心血來潮,貼貼全家桶。本多項式全家桶包含了 多項式乘法,多項式求逆,多項式求ln,多項式求exp,多項式除法,多項式取模,多項式多點求值,以及乙個為了多點求值用的分治ntt。由於時代變了,博主的多點求值使用了常數較小的版本。include define i inline define fi ...

爆牙齒 說說我期待中的蘋果那塊板子。

這是去年 2009 08 29 20 36 寫的文章,因為傳說9月蘋果平板會發布。結果沒發布,那段時間正是我繁忙的時候,也就放下了沒寫完。今天,再過3小時,就真正要發布平板了,我想起這篇沒發沒寫完的文章,趕快發出來要不就沒機會了。文章沒進行校對和潤色,比較散,湊合了。隨著9月的來臨,夏天熬完了,我有...

自己看的Manacher

1.問題引入 最長回文子串 即在給定的串中找到乙個子串,該子串是回文串且長度最長。回文串即對稱串。舉例 s abadaba 回文子串有 aba abadaba 而最大的即是s本身 2.常規方法 1 暴力演算法 o n3 暴力列舉每乙個子串,判斷是否為回文串。若是,記錄並更新長度 若不是,則跳過。in...