Prefix-Suffix Palindrome (Manacher algorithm)

Topic Link

Manacher algorithm

#include<bits/stdc++.h> 
using namespace std;
int t;
string s;
int q[2000006];
char ss[2000006];
int manacher(string a)
{
	int len=a.size();
	int now=0;
	for(int i=0;i<len;i++)
	{
		ss[now++]='&';
		ss[now++]=a[i];
	}
	ss[now++]='&';
	ss[now]=0;
	//处理字符串 
	q[0]=1;
	int ct=0;
	int r=0;
	int ans=0;//从端点开始的最长回文串半径 
	for(int i=1;i<now;i++)
	{
		if(i<r) q[i]=min(q[2*ct-i],r-i);
		else q[i]=1;
		while(i-q[i]>=0&&i+q[i]<now&&ss[i-q[i]]==ss[i+q[i]])
		{
			q[i]++;
		}
		if(q[i]+i>r)
		{
			r=q[i]+i;
			ct=i;
		}
		if(i-q[i]+1==0)
		{
			ans=max(ans,q[i]);
		}
	}
	
	return ans-1;
}
int main()
{
	cin.sync_with_stdio(false);
	cin>>t;
	while(t--)
	{
		cin>>s;
		int len=s.size();
		int minl=0;
		for(int i=0;i<len-1-i;i++)
		{
			if(s[i]==s[len-i-1]) minl++;
			else break;
		}
		
		int a1=manacher(s.substr(minl,len-2*minl));
		
		string t=s.substr(minl,len-2*minl);
		reverse(t.begin(),t.end());
		int a2=manacher(t);
		
		cout<<s.substr(0,minl);			
		if(a1>0&&a2>0&&a1>=a2)
		{	
			cout<<s.substr(minl,a1);			
		}
		else if(a1>0&&a2>0) 
		{
			string t=s.substr(minl,len-2*minl);
			reverse(t.begin(),t.end());
			cout<<t.substr(0,a2);						
		}		
		cout<<s.substr(len-minl)<<endl;
	}
	return 0;
}

 

Published 54 original articles · won praise 7 · views 3430

Guess you like

Origin blog.csdn.net/qq_43868883/article/details/105010932