求最長的回文串。
有一次用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 為中心最遠能向右擴...