給定乙個字串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...