PAT ~ L2-008. 最長對稱子串 (Manacher)
阿新 • • 發佈:2019-02-01
思路:裸的馬拉車演算法,,,字尾陣列應該也可以做
Manacher:
#include<bits/stdc++.h> using namespace std; const int MAXN = 1005 * 2; int Manacher(string a) { int len = a.size(), id = 0, MAX = 0, ans = -1, p[MAXN]; memset(p, 0, sizeof(p)); string s = "$#"; for (int i = 0; i < len; i++){ s += a[i]; s += '#'; } len = len * 2 + 1; for (int i = 1; i <= len; i++) { if (MAX > i) p[i] = max(p[2 * id - i], MAX - i); else p[i] = 1; while(s[i - p[i]] == s[i + p[i]]) p[i]++; ans = max(ans, p[i]); if(MAX < p[i] + i) { MAX = p[i] + i; id = i; } } return ans - 1; } int main() { string s; getline(cin, s); printf("%d", Manacher(s)); return 0; } /* Is PAT&TAP symmetric? */