很早就听说过马拉车算法,但一直没去看,之前因为打2017哈尔滨A题时一直过不了,听学长说可以用马拉车+树状数组过才开始看马拉车,找了个比较好懂的板子,鼓捣半天,结果洛谷板子题都过不了,还是回过头看原理,还好最后过了

#include <bits/stdc++.h>
using namespace std; 
char qdu[11000001];   
int mana()      
{                   
    int i;          
    int res = 0;    
    for(i = 1;qdu[i];i++)
    {               
        int l = i;  
        int r = i;  
        while(qdu[i] == qdu[r+1]) //以中心扩展,如果中心值abbba相等,那么当判断到第一个b的时候可以拓展到第三个b
        r++;    
        i = r;                  
        while(qdu[l-1] == qdu[r+1]) //向两侧扩展,找最大。
        {                       
            r++;
            l--;
        }           
        if(res < r-l+1) //更新最大值
        res = r-l+1;
    }
    return res;
}
int main()
{
    //int loop;
    qdu[0] = '$';
    gets(qdu+1);
    printf("%d\n",mana());
    return 0;
}