|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 798236606 于 2020-8-29 11:18 编辑
传送门:https://pintia.cn/problem-sets/9 ... /994805446102073344
解:
manacher算法
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int maxn = 1e3 + 10;
- char a[maxn];
- char b[maxn * 2];
- int p[maxn * 2];
- int init(char *a)
- {
- b[0] = '!';
- b[1] = '#';
- int j = 2;
- for (int i = 0; i < strlen(a); ++i)
- {
- b[j++] = a[i];
- b[j++] = '#';
- }
- b[j] = '\0';
- return j;
- }
- int manacher(char *a)
- {
- int len = init(a);
- int id = -1, mx = 0, ans = -1;
- for (int i = 1; i < len; ++i)
- {
- p[i] = (i < mx) ? min(p[2 * id - i], mx - i) : 1;
-
- while (b[i - p[i]] == b[i + p[i]]) ++p[i];
- if (i + p[i] > mx)
- {
- mx = i + p[i];
- id = i;
- }
- if (p[i] > ans) ans = p[i];
- }
- return ans - 1;
- }
- int main(void)
- {
- // freopen("input.txt", "r", stdin);
- scanf("%[^\n]", a);
- printf("%d", manacher(a));
- return 0;
- }
复制代码 |
|