class Manacher
{
private:
int maxlen=0,maxcenter=0,len;
string m;
vector<int> radius;
void construct(string s)
{
m="$#";
int n=s.size();
for(int i=0;i<n;i++)
{
m+=s[i];
m+='#';
}
len=m.size();
radius.resize(len);
}
void man(string s)
{
construct(s);
int center=0,right=0;
for(int i=0;i<len;i++)
{
if(right>i)//i is inside right border
radius[i]=min(radius[2*center-i],right-i);
else
radius[i]=1;
while(i>=radius[i]&&i+radius[i]<len&&m[i+radius[i]]==m[i-radius[i]])//extend to borders
radius[i]++;
if(right<i+radius[i])//update border
{
right=i+radius[i];
center=i;
}
if(radius[i]>maxlen)
{
maxlen=radius[i];
maxcenter=i;
}
}
}
public:
Manacher(string s)
{
man(s);
}
int getStart()
{
return maxcenter-maxlen+1;
}
int getEnd()
{
return maxcenter+maxlen;
}
string LongestPalindrome()
{
string ans;
int start=getStart(),end=getEnd();
for(int i=start;i<end;i++)
{
if(m[i]!='#')
ans+=m[i];
}
return ans;
}
vector<int> getRadius()
{
return radius;
}
};
代码收集0015——马拉车算法
最新推荐文章于 2022-03-13 18:04:39 发布