模板_manacher_字符串算法

// 马拉车
#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;
}

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/124953743
今日推荐