Manacher模板
Manacher模板
时间复杂度:\(O(n)\)
#include<bits/stdc++.h>
using namespace std;
const int N=1.1e7+5;
string s;
char dt[N<<1];
int p[N<<1],ans,cnt;//注意p是指半径
void Get(){//插入特殊字符,不用再分奇偶讨论了
dt[0]='#';
dt[++cnt]='|';
for(int i=0;i<s.size();i++){
dt[++cnt]=s[i];
dt[++cnt]='|';
}
dt[++cnt]='$';
}
void Manacher(){
for(int i=1,r=0,mid=0;i<=cnt;i++){
if(i<=r) p[i]=min(p[(mid<<1)-i],r-i+1);//在加速盒子里,直接取i的镜像和到r的距离的最小值
while(dt[i+p[i]]==dt[i-p[i]]) p[i]++;//得到已知信息后,向外扩展
if(i+p[i]-1>r){//超过加速盒子,就更新扩展
r=i+p[i]-1;
mid=i;
}
ans=max(ans,p[i]-1);//注意是p[i]-1
}
}
int main(){
cin>>s;
Get();
Manacher();
cout<<ans;
return 0;
}
关于一些点
本文来自博客园,作者:decentz,转载请注明原文链接:https://www.cnblogs.com/decentz/articles/23471337

浙公网安备 33010602011771号