poj 3974 Manacher Algorithm (求最长回文)

来源:互联网 发布:playclub 第三方软件 编辑:程序博客网 时间:2024/06/18 18:33
/*    Subject: Manacher Algorithm    Author : a_clay    Created Date : 2011-12-26    Sample : poj 3974*/#include <iostream>#include <string>#include <cstring>#include <vector>#include <queue>#include <algorithm>#define Bug cout << "here\n";using namespace std;const int N = 1000005;char str1[N];char str[2*N]; //start from index 1int rad[2*N], nn, n;void Manacher(int *rad, char *str, int n) { int i, id = 0, mx = 0;for(i = 1; i < n; i++) {if(mx > i) {rad[i] = min(rad[2*id - i], mx - i);}else rad[i] = 1;while(str[i+rad[i]] == str[i-rad[i]]) rad[i]++;if(rad[i] + i > mx) {mx = i + rad[i];id = i;}}}int main() {int i, ans, ca = 0;while(cin >> str1, strcmp(str1, "END")) {nn = strlen(str1);n = 2*nn + 2;str[0] = '$';str[n] = '\0';for(i = 0; i <= nn; i++) {str[2*i + 1] = '#';if(i != nn) str[2*i + 2] = str1[i];}memset(rad, 0, sizeof(rad));Manacher(rad, str, n);ans = 1;for(i = 0; i < n; i++) {ans = max(rad[i], ans);}printf("Case %d: %d\n", ++ca, ans-1);}return 0;}

原创粉丝点击