Palindrome
题目背景:
分析:裸的求最长回文串啦,manacher 大法好
#include
#include
#include
#include
#include
#include
#include
using namespace std; const int MAXN = 1000000 + 5; char s[MAXN << 1], t[MAXN << 1]; int p[MAXN << 1]; int cas, n; void manacher() { int mid = 0, mr = 0, x = 0, ans = 0; for (int i = 1; i <= n; ++i) { if (mr > i) x = min(p[mid * 2 - i], mr - i); else x = 1; while (s[i - x] == s[i + x]) x++; if (i + x > mr) mr = i + x, mid = i; p[i] = x, ans = max(p[i] - 1, ans); } printf("Case %d: %d\n", ++cas, ans); } int main() { while (scanf("%s", t + 1), t[1] != 'E') { int len = strlen(t + 1); s[n = 0] = '!'; for (int i = 1; i <= len; ++i) s[++n] = '#', s[++n] = t[i]; s[++n] = '#', s[n + 1] = '?'; manacher(); } return 0; }