本题就是求最长的回文子串。
字符串超长,不过限时却是也很长的15秒,最长的限时之一题目了,如果限时短点的话,估计能过的人不多。
使用Mancher算法是可以秒杀的。
模板式的Manacher算法:
#include <stdio.h> #include <vector> #include <string.h> #include <algorithm> #include <iostream> #include <string> #include <limits.h> #include <stack> #include <queue> #include <set> #include <map> using namespace std; const int MAX_N = 1000002; char s[MAX_N<<1]; int P[MAX_N<<1], len; inline int MIN(int a, int b) { return a < b? a : b; } inline int MAX(int a, int b) { return a > b? a : b; } void preProcess() { int i = len-1, j = len<<1; s[j+2] = '\0'; s[j+1] = '#'; for (; i >= 0; i--) { s[j--] = s[i]; s[j--] = '#'; } s[0] = '~'; } int Manacher() { len = strlen(s); preProcess(); len = len << 1 | 1; int maxLen = 0, right = 0, cen = 0; for (int i = 1; i <= len; i++) { P[i] = i<right? MIN(P[(cen<<1)-i], right-i) : 1; while (s[i-P[i]] == s[i+P[i]]) P[i]++; maxLen = MAX(maxLen, P[i]); if (right < i+P[i]) cen = i, right = i+P[i]; } return maxLen-1; } int main() { int t = 1; while (gets(s) && strcmp(s, "END") != 0) { printf("Case %d: %d\n", t++, Manacher()); } return 0; }
POJ 3974 Palindrome Manacher算法题解
时间: 2024-10-07 14:11:32