hdu 3068 最长回文

来源:互联网 发布:汤凤龙网络课 编辑:程序博客网 时间:2024/06/05 22:46

        hdu 3068 最长回文

        Manacher算法求最大的回文串长度

#include <stdio.h>#include <string.h>int min(int a, int b) {return a > b ? b : a;}char oldStr[110005], newStr[220010];int p[220010];int main() {int maxLen, maxId, id;int i;while (scanf("%s", &oldStr[1]) != EOF) {memset(p, 0, sizeof(p));for (i = 1; oldStr[i] != '\0'; i++) {newStr[i*2] = oldStr[i];newStr[i*2 + 1] = '#';}newStr[0] = '?'; newStr[1] = '#';newStr[i*2 + 1] = '\0';maxLen = maxId = id = 0;for (i = 1; newStr[i] != '\0'; i++) {if (maxId > i) {p[i] = min(p[2*id - i], maxId - i);} else {p[i] = 1;}while (newStr[i + p[i]] == newStr[i - p[i]]) {p[i]++;}if (p[i] + i > maxId) {maxId = p[i] + i;id = i;}if (p[i] > maxLen) {maxLen = p[i];}}printf("%d\n", maxLen - 1);}return 0;}
原创粉丝点击