HDU3068 manacher演算法 最長回文串

2021-08-06 04:44:18 字數 1109 閱讀 1722

求最長的回文串。

有一次用dp求過一次。

:我們都知道求回文串可以依賴於暴力的方法(以某點為重心,暴力的比唄),manacher方法的思想在於利用對稱性來減少暴力運算,從而提高效率。

從左到右遍歷字元,記錄最大的 回文串的右界(記當時的 字元位置為i)

分兩種情況 1 當前遍歷字元x在 右界右邊。這時候無法利用對稱性,只能乙個乙個算了。qwq 對應圖第乙個

2 單前字元 在字元右界左邊,hiahia 這下就可以利用了qwq

① x以i對稱的點的 回文串 完全被包括在 最大回文串中,由於對稱性說明當前的點的 回文串也被完全包括,無法拓展(如果可以拓展的話,那麼左邊也可以拓展,但是左邊已經計算過了,所以不能拓展) ,對應圖第二個 為 dp[id*2-i](id*2-i意思就是id對稱的i的位置)

② x以i對稱的點 的回文串 的左界 小於 最長回文串的左界(更左),這時候的長度 為 dp[id]+id-i(根據對稱性計算) ,為 綠色靠左那一部分。

③ 對稱點的左界和最大左界相等, 這時候可能 會增加。

具體見**

#include 

using

namespace

std;

/* manacher

求最長回文串,暴力操作。

就是利用對稱性,來減少這種操作。

記錄 最長的能夠到達的位置。

同時定義了三種情況。

不願意看到的情況 ,暴力查詢。

2 願意看到的情況

分三種情況

*/int main()

b[t]='#';

int zz=0,rig_max=0;

int max1=0;

for(int i=2;iif(zz+p[zz]>i) //包含在裡面了

else

if(p[i]+i>p[zz]+zz)

if(p[i]>max1) max1=p[i];

}printf("%d\n",max1-1);

}return

0;}

hdu3068 Manacher演算法 馬拉車演算法

回文串水題 參考部落格 manacher演算法 在o n 時間內找出最長的回文串的長度,第一步在字串首加乙個 然後在字串之間加 例 aaabb 處理後 a a a b b abba 處理後 a b b a p i 陣列 表示i所在字元為中心的回文字串的最大半徑 j i關於id的對稱的點 id i p...

hdu 3068 最長回文 manacher

給出乙個只由小寫英文本元a,b,c y,z組成的字串s,求s中最長回文串的長度.回文就是正反讀都是一樣的字串,如aba,abba等 輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c y,z組成的字串s 兩組case之間由空行隔開 該空行不用處理 字串長度len 110000 ...

hdu 3068 最長回文 manacher

好的講解manacher演算法的文章,並茂。題意 求給定串的最長回文子串 2009 多校題目 分析 列舉每個點向左向右擴充套件,看最遠能擴充套件到哪兒 但是普通的列舉是 n 2的,肯定超時。現在我們想 kmp或擴充套件 kmp一樣,給字串定義乙個 nex陣列,nex i 表示以i 為中心最遠能向右擴...