QDUOJ 10 - LC和加玛帝国的公主(马拉车)

LC和加玛帝国的公主
发布时间: 2015年9月19日 21:42 时间限制: 1000ms 内存限制: 256M

描述
有一天, 我们帅气的LC来到加玛帝国. 有时候, 缘分就是这么奇怪, LC和加玛帝国的公主一见钟情, 奈何公主的父王不同意, 因为他觉得LC除了长得特别帅之外, 并没有一技之长.

LC对此呵呵一笑, 他说, 我可是创新实验室走出来的学生, 我会的技能可多着呢, 先说个简单的吧, 只要你给我任意一串字符串, 我就能立马算出这串字符串当中最长回文串的长度. 国王很是吃惊, 说要考一考LC.

于是国王想让你帮忙写一个程序, 用来比对LC的答案, 快来帮帮国王吧!

输入
第一行输入一个T(T <= 50), 表示一共有T组测试数据. 接下来T行, 每行为一组由小写字母组成, 长度不超过10^5的字符串.

输出
每行一个整数X, 表示该组字符串中所包含的最长回文长度.

样例输入1 复制
3
aba
abc
aabaa
样例输出1
3
1
5

Manacher思路:

普通的最长回文串,每次做都要向两边延伸,同时考虑回文串长度奇偶的情况.

马拉车算法就是通过一些方法,使得不需要考虑奇偶的情况.

寻常马拉车算法就是在回文串的每个字符中都加一个标识符,这样长度是n+(n-1),必然是奇数,然后在头上加上标识符,防止越界.

但是有一种新的方法,可以消除奇偶的判断,而且空间要求也没有前者那么大.原理就是,回文串的中心部分,不管是奇数还是偶数,都是相等的,那么就从中心的左端向后遍历到中心的右端,然后再向两头扩展.

AC代码

#include
char qdu[100005];
int manachar()
{
    int i;
    int res = 0;
    for(i = 0;qdu[i];i++)
    {
        int l = i;
        int r = i;
        while(qdu[i] == qdu[r+1])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;
    scanf("%d",&loop);
    getchar();
    while(loop--)
    {
        qdu[0] = '$';
        gets(qdu+1);
        printf("%d\n",manachar());
    }
    return 0;
}

你可能感兴趣的:(QDUOJ)