manacher 记录

发布时间 2023-06-30 21:53:56作者: towboat

首先注意 2* n 的长度

 

 mx: 当前匹配到的最大长度 即 [1,mx]

id: mx 对应的中心点

pi : s[i] 为中心的回文串的最大长度,  pi /2 -1 是半径()

 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; 
 const int N=2.3*1E7;
 
 char s[N];
 char ss[N];
 int n,len,p[N];
 
 void manacher(){
 	int i,mid=0,mr=0;
 	
 	for(i=2;i<len;i++){
 		if(i<=mr) p[i]=min(p[mid*2-i],mr-i+1);
 		else p[i]=1;
 		
 		while(ss[i-p[i]]==ss[i+p[i]]) p[i]++;
 		if(i+p[i]>mr) mr=i+p[i]-1,mid=i;
 	}
 	
 	int ans=0;
 	for(int i=1;i<=n;i++) ans=max(ans,p[i]) ;
 	cout<<ans-1<<endl;
 }
 signed main(){
 	cin>>(s+1);
 	n=strlen(s+1);
 	
 	ss[++len]='!',ss[++len]='#';
 	for(int i=1;i<=n;i++) 
 		ss[++len]=s[i],ss[++len]='#';
 	//ss[++len]='?';
 	manacher();
 }