結果
問題 |
No.3239 Omnibus
|
ユーザー |
![]() |
提出日時 | 2025-08-14 23:50:55 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,339 ms / 10,000 ms |
コード長 | 2,300 bytes |
コンパイル時間 | 1,859 ms |
コンパイル使用メモリ | 202,264 KB |
実行使用メモリ | 127,872 KB |
最終ジャッジ日時 | 2025-08-14 23:51:21 |
合計ジャッジ時間 | 23,734 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 33 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; inline int encode(string& s, int start) { return (s[start] - 'a') * 26 * 26 + (s[start + 1] - 'a') * 26 + (s[start + 2] - 'a'); } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); const int ALL = 26 * 26 * 26; int N, Q; cin >> N >> Q; int k = (int)sqrt(N); if (k * k < N) k++; string state; cin >> state; vector<vector<ll>> sum(ALL, vector<ll>(k)); vector<vector<ll>> count(ALL, vector<ll>(k)); for (int i = 0; i < N - 2; i++) { int code = encode(state, i); int b = i / k; int rel = i - b * k; sum[code][b] += rel + 1; count[code][b]++; } for (int i = 0; i < Q; i++) { int q; cin >> q; if (q == 1) { int p; cin >> p; p--; char x; cin >> x; for (int j = p - 2; j <= p; j++) { if (j < 0 || j >= N - 2) continue; int c = encode(state, j); int b = j / k; int rel = j - b * k; sum[c][b] -= rel + 1; count[c][b]--; } state[p] = x; for (int j = p - 2; j <= p; j++) { if (j < 0 || j >= N - 2) continue; int c = encode(state, j); int b = j / k; int rel = j - b * k; sum[c][b] += rel + 1; count[c][b]++; } } else if (q == 2) { int l; cin >> l; l--; int r; cin >> r; string a; cin >> a; int code = encode(a, 0); int fl = l; long ans = 0; while (l < r - 2) { if (l % k == 0 && l + k <= r - 2) { ans += (l - fl) * count[code][l / k] + sum[code][l / k]; l += k; } else { if (encode(state, l) == code) ans += (l - fl) + 1; l++; } } cout << ans << endl; } } }