結果
| 問題 | No.2162 Copy and Paste 2 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-09-29 19:30:33 |
| 言語 | C++17 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 48 ms / 7,000 ms |
| + 309µs | |
| コード長 | 1,419 bytes |
| 記録 | |
| コンパイル時間 | 1,340 ms |
| コンパイル使用メモリ | 215,512 KB |
| 実行使用メモリ | 74,704 KB |
| 最終ジャッジ日時 | 2026-09-29 19:30:42 |
| 合計ジャッジ時間 | 4,078 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], sz[N], val[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) {
x = find(x);
y = find(y);
if(sz[x] > sz[y]) {
set[y] = x;
sz[x] += sz[y];
val[x] = val[y];
}
else {
set[x] = y;
sz[y] += sz[x];
}
}
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] = val[i] = i;
sz[i] = 1;
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 = val[find(i)]; now <= n; ++k, now = val[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;
}