马拉车算法

#include<bits/stdc++.h>
#define maxn 100005

using namespace std;

char str[maxn],s[maxn<<1];
int r[maxn<<1];
int l;
int ans=0;

void manacher()
{
    s[0]='*';
    s[1]='#';
    for(int i=0;i<l;i++)
    {
        s[(i+1)<<1]=str[i];
        s[(i+1)<<1|1]='#';
    }
    l=l*2+2;
    int max_r=0,pos=0;
    for(int i=0;i<l;i++)
    {
        if(max_r>i)
            r[i]=min(max_r-i,r[2*pos-i]);
        else
            r[i]=0;
        while(i+r[i]+1<l&&i-r[i]-1>=0&&s[i+r[i]+1]==s[i-r[i]-1])
            r[i]++;
        if(r[i]+i>max_r)
        {
            max_r=r[i]+i;
            pos=i;
        }
        ans=max(ans,r[i]);
    }
}
posted @ 2018-09-19 19:05  LOSER_琪  阅读(139)  评论(0)    收藏  举报