結果
| 問題 | No.2162 Copy and Paste 2 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-09-29 19:32:16 |
| 言語 | C++17 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 34 ms / 7,000 ms |
| + 724µs | |
| コード長 | 1,234 bytes |
| 記録 | |
| コンパイル時間 | 1,120 ms |
| コンパイル使用メモリ | 216,376 KB |
| 実行使用メモリ | 68,340 KB |
| 最終ジャッジ日時 | 2026-09-29 19:32:24 |
| 合計ジャッジ時間 | 3,829 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 |
ソースコード
#include <bits/stdc++.h>
using LL = long long;
const int N = 2e6 + 7;
char s[N];
int z[N], f[N], set[N], n;
std::vector<int> b[N];
void getz() {
z[1] = 0;
for(int i = 2, p = 1, r = 1; i <= n; ++i) {
z[i] = (i < r ? std::min(z[i - p + 1], r - i) : 0);
while(s[z[i] + 1] == s[z[i] + i])
++z[i];
if(i + z[i] > r) {
r = i + z[i];
p = i;
}
}
}
int find(int x) {
return set[x] == x ? x : set[x] = find(set[x]);
}
void uni(int x, int y) {
set[find(x)] = find(y);
}
void solve() {
scanf("%s", s + 1);
n = strlen(s + 1);
getz();
memset(f, 0x3f, sizeof f);
for(int i = 1; i <= n + 1; ++i) {
set[i] = i;
b[i].clear();
}
for(int i = 1; i <= n; ++i) {
z[i] = std::min(i - 1, z[i]);
if(z[i] <= 1)
uni(i, i + 1);
else
b[z[i]].push_back(i);
}
f[1] = 1;
for(int i = 1; i <= n; ++i) {
f[i] = std::min(f[i], f[i - 1] + 1);
for(int k = 1, now = find(i); now <= n; ++k, now = find(now + i))
f[i + now - 1] = std::min(f[i + now - 1], f[i] + now - k * (i - 1));
for(int p: b[i])
uni(p, p + 1);
}
printf("%d\n", f[n]);
}
int main() {
int cases = 1;
//scanf("%d", &cases);
while(cases--)
solve();
return 0;
}