模板 manacher演算法

2022-06-01 19:06:09 字數 888 閱讀 2549

回文串長度的奇偶性造成了對稱軸的位置可能在某字元上,也可能在兩個字元之間的空隙處

那麼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 #include4

using

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。這樣我們如果要記錄回文串的對稱中心,就顯得複雜了。為了解決這個問題,把兩種情況統一起來,我們就在字母之間插入隔板,這樣兩個問題就...