1040. Longest Symmetric String (25)Manacher

来源:互联网 发布:java 函数重载形式 编辑:程序博客网 时间:2024/04/30 16:47

1040. Longest Symmetric String (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given "Is PAT&TAP symmetric?", the longest symmetric sub-string is "s PAT&TAP s", hence you must output 11.

Input Specification:

Each input file contains one test case which gives a non-empty string of length no more than 1000.

Output Specification:

For each test case, simply print the maximum length in a line.

Sample Input:
Is PAT&TAP symmetric?
Sample Output:
11

题解:求最长回文串问题,必然manacher算法啊


#include <cstdio>#include <cstring>const int N = 2020;int min(const int& a, const int& b) {    return a < b ? a : b;}int main() {    char ch;    int len = 0;    int ary[N], p[N] = {0};    while ((ch = getchar()) != EOF) {        ary[len] = -1;        ary[len + 1] = ch;        len += 2;    }    ary[len++] = -2;    int max_len = 0;    int id = 0;    for (int i = 1; i < len; ++i) {        if (id + p[id] > i) p[i] = min(id + p[id] - i, p[id * 2 - i]);        else p[i] = 1;        while (i - p[i] >= 0 && ary[i - p[i]] == ary[i + p[i]]) ++p[i];        if (max_len < p[i]) max_len = p[i];        if (p[id] < p[i]) id = i;    }    printf("%d\n", max_len - 1);    return 0;}


0 0
原创粉丝点击