// 马拉车
#include<bits/stdc++.h>
using namespace std;
string s,ts;
vector<int> len;
void init() // string &s
{
ts.clear();
ts+='@'; // begin
for( int i=0;i<s.size();i++ )
{
ts+='#'; ts+=s[i];
}
ts+='#'; ts+='$'; // end
len.clear();
len.resize( ts.size(),0 );
} // return ts.size()-2
int manacher() // string &ts,int ts.size()-2
{
int mid,yy,ans,i;
mid=yy=ans=0;
// 对称
for( i=1;i<=ts.size()-2;i++ ) // symmetry len[j]>len[mid] vs len[j]<len[mid]
{
if( yy>i ) len[i]=min( yy-i,len[2*mid-i] );
else len[i]=1; // over than i>=yy =also
while( ts[i-len[i]]==ts[i+len[i]] ) len[i]++;
if( len[i]+i>yy ) { yy=len[i]+i; mid=i; } // update yy
ans=max( ans,len[i] );
}
return ans-1; // len[i]-1 == origin_len
}
int main()
{
while( cin>>s )
{
init();
cout<<manacher()<<endl;
}
return 0;
}
模板_manacher_字符串算法
猜你喜欢
转载自blog.csdn.net/qq_63173957/article/details/124953743
今日推荐
周排行