回文串長度的奇偶性造成了對稱軸的位置可能在某字元上,也可能在兩個字元之間的空隙處
那麼manacher對此的優化是在每兩個字元中間插入另乙個字元,如'#'。
用乙個輔助陣列r表示每個點能夠擴充套件出的回文長度
我們先設定乙個輔助變數maxright,表示已經觸及到的最右邊的字元
另外還要設定乙個輔助變數mid,表示包含maxright的回文串的對稱軸所在的位置
當i在maxright左邊且在mid右邊時:
設i關於mid的對稱點為j,顯然r[i]一定不會小於r[j]。(對稱)
我們沒必要儲存j,j可以通過計算得出,為:(mid<<1)−i
那麼我們就設定r[i]=r[j]然後繼續嘗試擴充套件,這樣就可以較快地求出r[i],然後更新maxright和mid
當i在maxright右邊時,我們無法得知關於r[i]的資訊,只好從1開始遍歷,然後更新maxright和mid
1 #include2 #include3 #include4using
namespace
std;
5char t[11000010], a[11000010];6
int n, m, ans=0;7
int r[23000000];8
intmain()
16 n=(m<<1)+2;17
int mid=1, maxright=1
;18 r[1]=1;19
for(int i=2; i)
27if(r[i]>ans) ans=r[i];28}
29 printf("
%d\n
", ans-1
);30
return0;
31 }
模板 manacher演算法
題目描述 給出乙個只由小寫英文本元a,b,c y,z組成的字串s,求s中最長回文串的長度.字串長度為n 輸入輸出格式 輸入格式 一行小寫英文本元a,b,c y,z組成的字串s 輸出格式 乙個整數表示答案 輸入輸出樣例 輸入樣例 1 aaa 輸出樣例 1 3 說明 字串長度len 11000000 b...
回文串 Manacher演算法(模板)
用途 在o n 時間內,求出以每乙個點為中心的回文串長度。首先,有乙個非常巧妙的轉化。由於回文串長度有可能為奇數也有可能為偶數,說明回文中心不一定在乙個字元上。所以要將字串做如下處理 在每兩個字母之間插入乙個特殊字元,通常用 這樣所有的回文串就都變成了以乙個字元為回文中心的。並且,我們需要在字串的開...
題解 P3805 模板 manacher演算法
我們先看兩個字串 abccba abcdcba 顯然這兩字串是回文的 然而兩個串的對稱中心的特性不同,第乙個串,它的對稱中心在兩個c中間,然而第二個串,它的對稱中心就是d。這樣我們如果要記錄回文串的對稱中心,就顯得複雜了。為了解決這個問題,把兩種情況統一起來,我們就在字母之間插入隔板,這樣兩個問題就...