馬拉車模板

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstdlib>
using namespace std;
char p[210000];
char t[210000];
int l[210000];
void manacher()
{   
    int len=strlen(t);
    p[0]='$',p[1]='#';
    int pos=2;
    for(int i=0;i<len;i++)
    {
        p[pos]=t[i];
        p[pos+1]='#';
        pos+=2;
    }
    p[pos]='\0';                          //這行十分重要,不能丟了
    int id=0,maxlen=0,index=0,mx=0;//mx代表目前的迴文串能到的最右的位置, id是對稱中軸。 
    for(int i=1;i<pos;i++)
    {

        l[i]=mx>i?min(l[2*id-i],mx-i):1;  //整個算法的精髓所在
        while(p[l[i]+i]==p[i-l[i]]) ++l[i];
        if(mx-i<l[i])
        {
            mx=i+l[i];
            id=i;
        }
        if(l[i]>maxlen)
        {
            maxlen=l[i];
            index=i;
        }
    }
    /*for(int i=2;i<pos;i+=2)
    	printf("%d ",l[i]);
    printf("\n");*/
    for(int i=2;i<pos;i+=2)
		l[i/2]=l[i]/2;
    /*int mid=index/2;
    for(int i=mid-l[mid]+1;i<=mid+l[mid]-1;i++)
    	printf("%c",t[i-1]);
    printf("\n");*/
    printf("%d\n",maxlen-1);     //輸出最長迴文串長度
}
int main()
{
    while(~scanf("%s",t))
    {
        manacher();
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章