HDU 3068 manacher回文数算法

来源:互联网 发布:淘宝网店团队架构 编辑:程序博客网 时间:2024/04/29 19:26

最长回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11591 Accepted Submission(s): 4210

Problem Description
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等

Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c…y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000

Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.

Sample Input
aaaa

abab

Sample Output
4
3

开始忘了应该是开比题目要求大两倍的数组。 。数组越界好久。 。T^T
这题是manacher算法的一个应用。

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>//#define LOCALusing namespace std;char s[220020];int p[220020];int main(){#ifdef LOCAL    freopen("data.in","r",stdin);#endif // LOCAL    char k;    while( (k = getchar()) != EOF){        if(k == '\n')            k = getchar();        s[0] = '$';        s[1] = '#';        int i = 2,j = 0;        while(k!='\n'&&k!=EOF){            if(i%2)                s[i++] = '#';            else{                s[i++] = k;                k = getchar();            }        }        s[i] = '#';        int len = i+1;        int mx = 0;        int id;        int Max = -0x3f3f3f3f;        for(i = 1;i<len;i++){            if(mx>i)                p[i] = min(p[2*id-i],mx-i);            else                p[i] = 1;            while(s[i-p[i]] == s[i+p[i]])                p[i]++;            if(i+p[i]>mx){                mx = i+p[i];                id = i;            }            if(p[i]>Max)                Max = p[i];        }        printf("%d\n",Max-1);        if(k == EOF)            break;    }    return 0;}
0 0
原创粉丝点击