【HDU3068】最长回文【Manacher】

来源:互联网 发布:请叫我威廉三世知轩 编辑:程序博客网 时间:2024/05/16 12:33

模板题。


#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 220005;int n, p[maxn];char str[maxn], s[maxn];int main() {while(scanf("%s", str) != EOF) {int len = strlen(str); n = (len << 1) + 2;s[0] = '$';for(int i = 0; i <= len; i++) {s[(i << 1) + 1] = '#';s[(i << 1) + 2] = str[i];}int mx = 0, id = 0;for(int i = 1; i < n; i++) {p[i] = mx > i ? min(p[(id << 1) - i], mx - i) : 1;for(; s[i + p[i]] == s[i - p[i]]; p[i]++);if(i + p[i] > mx) {mx = i + p[i];id = i;}}int ans = 1;for(int i = 0; i < n; i++) ans = max(ans, p[i]);printf("%d\n", ans - 1);}return 0;}


0 0