manacher
用于在字符串中寻找最长回文子串的高效算法
Manacher 算法的核心思想是利用已经计算出的回文子串的信息来加速后续的计算。它通过在原始字符串的每个字符之间插入一个特殊字符(通常用#),将奇数长度和偶数长度的回文子串统一处理,使得每个回文子串都以一个字符为中心对称。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
string a, s;
int r[N];
int intt() //中间加入“#”以便判断偶数回文串
{
s[0]='$';
s[1]='#';
int l=a.size();
int k=1;
for(int i=0;i<l;i++)
{
s[++k]=a[i];
s[++k]='#';
}
s[++k]=' ';
return k;
}
void manacher()
{
int n=intt();
int p=1,mx=1;
for(int i=1;i<=n;i++)
{
if(i<mx) r[i]=min(mx-i,r[p*2-i]);
else r[i]=1;
while(s[i+r[i]]==s[i-r[i]])
r[i]++;
if(i+r[i]>mx)
p=i,mx=i+r[i];
}
}
int main()
{
cin>>a;
manacher();
return 0;
}
本文来自博客园,作者:流氓兔LMT,转载请注明原文链接:https://www.cnblogs.com/-include-lmt/p/18741811

浙公网安备 33010602011771号