回文串 Manacher演算法(模板)

2022-06-06 02:39:09 字數 1011 閱讀 3663

用途:在o(n)時間內,求出以每乙個點為中心的回文串長度。

首先,有乙個非常巧妙的轉化。由於回文串長度有可能為奇數也有可能為偶數,說明回文中心不一定在乙個字元上。所以要將字串做如下處理:在每兩個字母之間插入乙個特殊字元,通常用「#」,這樣所有的回文串就都變成了以乙個字元為回文中心的。並且,我們需要在字串的開頭或者結尾插入另乙個特殊字元,比如說「*」,防止它無休止地匹配下去。

變數宣告:

mx:當前已經判斷過的能成為回文串的最遠長度。比如說如果字串為bacabaaa,列舉回文中心到c,那麼mx應該為5,即b的位置。

id:mx所對應的回文中心。

p[i]:以i為中心的回文串向某一邊最多延伸的長度。同樣是上面那個例子,p[3]=3,p[7]=2,p[1]=1.

例題:k–弗基桑

要求:數字序列,求最長回文串長度。

注意填充的時候要用數列中一定沒有出現的字元進行填充。

#include 

#include

#include

using

namespace

std;

const

int maxn = 1e5 + 5;

int t, n;

int s[maxn], s_new[2 * maxn-100000];

int p[2 * maxn-100000];

int init()

s_new[j] = 1e9 + 12;//上面的三個數需要不相同

return j; // 返回 s_new 的長度

}int manacher()

max_len = max(max_len, p[i] - 1);

}return max_len;

}int main()

printf("%d\n", manacher());

}return

0;}

模板 最長回文串 manacher

題目描述 給出乙個只由小寫英文本元組成的字串s,求s中最長回文串的長度.字串長度len 110000。ababa的回文長度是5 輸出字串s中所包含的最長回文長度.const int maxn 300000 陣列長度上限 char a maxn b maxn 原始字串 新修改後字串 int len m...

(回文串)Manacher演算法

標籤 acm 回文串 manacher 輸入乙個字串,求出其中最大的回文子串。子串的含義是 在原串中連續出現的字串片段。回文的含義是 正著看和倒著看相同,如abba和yyxyy。這裡介紹o n 回文子串 manacher 演算法 演算法基本要點 首先用乙個非常巧妙的方式,將所有可能的奇數 偶數長度的...

(Manacher)演算法 O n 回文子串

資料 網路 參見 問題描述 輸入乙個字串,求出其中最大的回文子串。子串的含義是 在原串中連續出現的字串片段。回文的含義是 正著看和倒著看相同,如abba和yyxyy。解析 這裡介紹o n 回文子串 manacher 演算法 演算法基本要點 首先用乙個非常巧妙的方式,將所有可能的奇數 偶數長度的回文子...