用途:在o(n)時間內,求出以每乙個點為中心的回文串長度。
首先,有乙個非常巧妙的轉化。由於回文串長度有可能為奇數也有可能為偶數,說明回文中心不一定在乙個字元上。所以要將字串做如下處理:在每兩個字母之間插入乙個特殊字元,通常用「#」,這樣所有的回文串就都變成了以乙個字元為回文中心的。並且,我們需要在字串的開頭或者結尾插入另乙個特殊字元,比如說「*」,防止它無休止地匹配下去。例題:k–弗基桑變數宣告:
mx:當前已經判斷過的能成為回文串的最遠長度。比如說如果字串為bacabaaa,列舉回文中心到c,那麼mx應該為5,即b的位置。
id:mx所對應的回文中心。
p[i]:以i為中心的回文串向某一邊最多延伸的長度。同樣是上面那個例子,p[3]=3,p[7]=2,p[1]=1.
要求:數字序列,求最長回文串長度。
注意填充的時候要用數列中一定沒有出現的字元進行填充。
#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 演算法 演算法基本要點 首先用乙個非常巧妙的方式,將所有可能的奇數 偶數長度的回文子...