結果
問題 | No.765 ukuku 2 |
ユーザー |
|
提出日時 | 2018-12-13 02:18:47 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 141 ms / 3,000 ms |
コード長 | 1,982 bytes |
コンパイル時間 | 362 ms |
コンパイル使用メモリ | 34,944 KB |
実行使用メモリ | 8,344 KB |
最終ジャッジ日時 | 2024-09-25 04:08:25 |
合計ジャッジ時間 | 3,571 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 48 |
ソースコード
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#define M 1000000007long long B;int n;char s[200001];char t[200001];long long H[200001];long long G[200001];long long P[200001];int min(int x, int y) {return x < y ? x : y;}int max(int x, int y) {return x > y ? x : y;}long long mod(long long x) {x %= M;if (x < 0) x += M;return x;}long long f(int l, int n) {return mod(H[l + n] - H[l] * P[n]);}long long g(int l, int n) {return mod(G[l + n] - G[l] * P[n]);}int lcp(int a, int b, int n1, int n2) {int l = 0;int r = min(n1, n2) + 1;while (r - l > 1) {int mid = (l + r) / 2;if (f(a, mid) == g(b, mid)) {l = mid;} else {r = mid;}}return l;}int solve(int a, int b, int n1, int n2) {int l = 0;int r = min(n1, n2) + 1;while (r - l > 1) {int mid = (l + r) / 2;if (f(a, mid) == g(b, mid)) {l = mid;} else {r = mid;}}a += l;b += l;n1 -= l;n2 -= l;int vl = lcp(a, b + 1, n1, n2 - 1);int vr = lcp(a + 1, b, n1 - 1, n2);return l + max(vl, vr);}int main() {scanf("%s", s);n = strlen(s);for (int i = 0; i < n; i++) {t[n - 1 - i] = s[i];}srand(time(NULL));B = rand() % M;P[0] = 1;for (int i = 1; i <= n; i++) {P[i] = B * P[i - 1] % M;}for (int i = 0; i < n; i++) {H[i + 1] = (H[i] * B + s[i]) % M;G[i + 1] = (G[i] * B + t[i]) % M;}int ans = 0;// odd lengthfor (int i = 0; i < n; i++) {int x = 2 * solve(i + 1, n - i, n - i - 1, i);x = min(x, n - 2);ans = max(ans, x + 1);}// even lengthfor (int i = 1; i < n; i++) {int x = 2 * solve(i, n - i, n - i, i);x = min(x, n - 1);ans = max(ans, x);}printf("%d\n", ans);}