結果
| 問題 | No.765 ukuku 2 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-12-13 12:20:50 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,604 bytes |
| 記録 | |
| コンパイル時間 | 314 ms |
| コンパイル使用メモリ | 34,560 KB |
| 実行使用メモリ | 14,976 KB |
| 最終ジャッジ日時 | 2024-09-25 04:24:06 |
| 合計ジャッジ時間 | 7,392 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 42 WA * 6 |
ソースコード
#include <stdio.h>
#include <string.h>
#define N 400001
#define M 262144
int n;
char s[N+1];
int sa[N+1], ra[N+1], ha[N+1];
int sg[M*2];
int min(int x, int y) { return x < y ? x : y; }
int max(int x, int y) { return x > y ? x : y; }
void buildsa() {
for (int i = 0; i <= n; i++) ra[i] = s[i];
for (int k = 1; k <= n; k *= 2) {
static int rb[N + 1], sm[N + 3], tm[N + 1];
for (int i = 0; i <= n; i++) rb[i] = i + k <= n ? ra[i + k] + 1 : 0;
memset(sm, 0, sizeof(sm));
for (int i = 0; i <= n; i++) sm[rb[i] + 1]++;
for (int i = 0; i <= N; i++) sm[i + 1] += sm[i];
for (int i = 0; i <= n; i++) sa[sm[rb[i]]++] = i;
memset(sm, 0, sizeof(sm));
memcpy(tm, sa, sizeof(tm));
for (int i = 0; i <= n; i++) sm[ra[i] + 1]++;
for (int i = 0; i <= N; i++) sm[i + 1] += sm[i];
for (int i = 0; i <= n; i++) sa[sm[ra[tm[i]]]++] = tm[i];
tm[sa[0]] = 0;
for (int i = 1; i <= n; i++) tm[sa[i]] = tm[sa[i - 1]] + (ra[sa[i - 1]] != ra[sa[i]] || rb[sa[i - 1]] != rb[sa[i]]);
memcpy(ra, tm, sizeof(ra));
}
}
void buildha() {
int k = 0;
for (int i = 0; i <= n; i++) {
if (ra[i] == n) continue;
int j = sa[ra[i] + 1];
while (s[i + k] == s[j + k]) k++;
ha[ra[i]] = k;
if (k > 0) k--;
}
for (int i = 0; i <= n; i++) {
sg[i + M] = ha[i];
}
for (int i = M - 1; i > 0; i--) {
sg[i] = min(sg[i * 2], sg[i * 2 + 1]);
}
}
int lcp(int i, int j) {
if (i == j) return n - i;
i = ra[i];
j = ra[j];
int l = min(i, j) + M;
int r = max(i, j) + M;
int res = 2147483647;
for (; l < r; l >>= 1, r >>= 1) {
if (l & 1) res = min(res, sg[l++]);
if (r & 1) res = min(res, sg[--r]);
}
return res;
}
int solve(int i, int j, int n1, int n2) {
int h = lcp(i, j);
if (h == n1 || h == n2) return h;
i += h;
j += h;
return h + max(lcp(i + 1, j), lcp(i, j + 1));
}
int main() {
scanf("%s", s);
int m = strlen(s);
for (int i = 0; i < m; i++) {
s[m + 1 + i] = s[m - 1 - i];
}
s[m] = '$';
n = m * 2 + 1;
s[n] = 0;
buildsa();
buildha();
int ans = 0;
/* even length */
for (int i = 0; i < m; i++) {
int x = 2 * solve(i + 1, n - i, m - i - 1, i);
x = min(x, m - 2);
ans = max(ans, x + 1);
}
/* odd length */
for (int i = 1; i < m; i++) {
int x = 2 * solve(i, n - i, m - i, i);
x = min(x, m - 1);
ans = max(ans, x);
}
printf("%d\n", ans);
return 0;
}