0
点赞
收藏
分享

微信扫一扫

Luogu P4555 [国家集训队]最长双回文串


题目链接:​​传送门​​

要求的最长双回文串可以通过拼接两个回文串得到
所以我们处理出每个回文串的最左端和最右端
挨个拼接尝试
但是洛谷更新了数据之后好像会被hack掉…
所以,,,看代码吧

/**
* @Date: 2019-03-10T18:56:14+08:00
* @Last modified time: 2019-03-10T20:26:33+08:00
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define
#define

using namespace std;
typedef long long ll;
char tmp[A >> 1], s[A];
int mx, id, p[A], n, ans, T, l[A], r[A];
void manacher() {
for (int i = 1; i < n; i++) {
if (mx > i) p[i] = min(p[id * 2 - i], mx - i);
else p[i] = 1;
while (s[i - p[i]] == s[i + p[i]]) ++p[i];
if (i + p[i] > mx) {
mx = p[i] + i;
id = i;
}
}
for (int i = 1, j = 1; i < n; i++)
for (; j <= i + p[i] - 1; j++)
l[j] = i;
for (int i = n - 1, j = n - 1; i >= 1; i--)
for (; j >= i - p[i] + 1; j--)
r[j] = i;
for (int i = 1; i < n; i++) ans = max(ans, r[i] - l[i]);
if (ans == 3) puts("2");
else if (ans == 5) puts("4");
else printf("%d\n", ans);
}

int main(int argc, char const *argv[]) {
scanf("%s", tmp); int lex = strlen(tmp);
mx = -1, id = 0, n = 2, ans = 0; s[0] = '!'; s[1] = '#';
for (int i = 0; i < lex; i++) s[n++] = tmp[i], s[n++] = '#';
manacher();
}


举报

相关推荐

0 条评论