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;
}

关于一些点

呵呵,只有我能看

posted @ 2026-10-28 19:52  decentz  阅读(4)  评论(0)    收藏  举报