結果
| 問題 | No.765 ukuku 2 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-12-13 05:33:08 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,231 bytes |
| 記録 | |
| コンパイル時間 | 405 ms |
| コンパイル使用メモリ | 34,688 KB |
| 実行使用メモリ | 12,916 KB |
| 最終ジャッジ日時 | 2024-09-25 04:15:40 |
| 合計ジャッジ時間 | 18,363 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | RE * 2 |
| other | RE * 48 |
コンパイルメッセージ
main.cpp: In function 'int buildha()':
main.cpp:61:1: warning: no return statement in function returning non-void [-Wreturn-type]
61 | }
| ^
ソースコード
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 400001
#define M 262144
int n, k;
char s[N + 1];
int sa[N + 1], ra[N + 1], ha[N + 1], tmp[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;
}
int cmp(const void *i_, const void *j_) {
int i = *(int *)i_;
int j = *(int *)j_;
if (ra[i] != ra[j]) return ra[i] - ra[j];
int ri = i + k <= n ? ra[i + k] : -1;
int rj = j + k <= n ? ra[j + k] : -1;
return ri - rj;
}
void buildsa() {
for (int i = 0; i <= n; i++) {
ra[i] = s[i];
sa[i] = i;
}
k = 1;
for (; k <= n; k *= 2) {
qsort(sa, n + 1, sizeof(int), cmp);
tmp[sa[0]] = 0;
for (int i = 0; i < n; i++) {
tmp[sa[i + 1]] = tmp[sa[i]] + (cmp(&sa[i], &sa[i + 1]) < 0);
}
memcpy(ra, tmp, sizeof(ra));
}
}
int 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;
}