manacher模板
详细讲解可以看这个
下面只是些模板
纯模板
int manacher()
{
// 将数组初始化
init();
int p[N*2],ans=0,mx=0,max_len=-1,id=0,index;
// p[i]代表以i为中心的回文串半径,p[i]-1是以i为中心的最长回文串(相对于原字符串)
//中心点最右端位置mx,id是中心点
// max_len是该中心点的半径
//(中心点是指目前半径最长的点)
for (int i = 1; i < a.size();i++)
{
p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
//i+p[i]刚好是'未知点'
while(a[i+p[i]]==a[i-p[i]])
p[i]++;
if(mx<i+p[i])
{
mx = i + p[i];
id = i;
}
}
for (int i = 0; i < a.size();i++)
ans = max(p[i] - 1, ans);
return ans;
}
吉哥系列故事——完美队形II
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+6;
int n,T,x,ans;
vector<int> a;
int manacher()
{
int p[N*2],ans=0,mx=0,max_len=-1,id=0,index;
// p[i]代表以i为中心的回文串半径,p[i]-1是以i为中心的最长回文串(相对于原字符串)
//中心点最右端位置mx,id是中心点
// max_len是该中心点的半径
//(中心点是指目前半径最长的点)
for (int i = 1; i < a.size();i++)
{
p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
//i+p[i]刚好是'未知点'
while(a[i+p[i]]==a[i-p[i]]&&a[i+p[i]-2]>=a[i+p[i]])//要记住马拉车中间加了个奇怪字符
p[i]++;
if(mx<i+p[i])
{
mx = i + p[i];
id = i;
}
}
for (int i = 0; i < a.size();i++)
ans = max(p[i] - 1, ans);
return ans;
}
int main()
{
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
a.clear();
a.push_back(-1);
a.push_back(0);
for (int i = 1; i <= n;i++)
{
scanf("%d", &x); //x in 50~250;
a.push_back(x);
a.push_back(0);
}
printf("%d\n",manacher());
}
return 0;
}
$道路千万条,点赞第一条;阅读不规范,笔者两行泪$