結果
| 問題 |
No.3239 Omnibus
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-08-16 04:04:17 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 555 ms / 10,000 ms |
| コード長 | 2,040 bytes |
| コンパイル時間 | 2,062 ms |
| コンパイル使用メモリ | 201,140 KB |
| 実行使用メモリ | 44,172 KB |
| 最終ジャッジ日時 | 2025-08-16 04:04:32 |
| 合計ジャッジ時間 | 15,021 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 33 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define BL 512
#define SB (BL - 1)
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n, q;
cin >> n >> q;
string s;
cin >> s;
constexpr int r = 26 * 26 * 26;
const int bsz = (n + BL - 1) / BL;
vector<array<int, r>> seg(bsz);
vector<array<short,r>> cnt(bsz);
vector<short> vec(n);
auto add = [&](int p, int d){
int hs = vec[p];
if(d == 1){
seg[p / BL][hs] += p - (p / BL * BL) + 1;
cnt[p / BL][hs]++;
}else{
seg[p / BL][hs] -= p - (p / BL * BL) + 1;
cnt[p / BL][hs]--;
}
};
short hs = (s[0] - 'a') * 26 + (s[1] - 'a');
for(int i = 0; i + 3 <= n; i++){
hs *= 26;
hs += s[i + 2] - 'a';
vec[i] = hs;
add(i, 1);
hs -= 676 * (s[i] - 'a');
}
while(q--){
int cmd;
cin >> cmd;
if(cmd == 1){
int p;
char x;
cin >> p >> x;
p--;
for(int i = p; i >= p - 2 && i >= 0; i--) add(i, -1);
s[p] = x;
for(int i = p; i >= p - 2 && i >= 0; i--){
vec[i] = ((s[i] - 'a') * 26 + (s[i + 1] - 'a')) * 26 + s[i + 2] - 'a';
add(i, 1);
}
}else{
int l, r;
char c0, c1, c2;
ll ans = 0;
cin >> l >> r >> c0 >> c1 >> c2;
short hs = (((c0 - 'a') * 26) + (c1 - 'a')) * 26 + c2 - 'a';
l--, r -= 2;
int cur = l;
while(cur < r && (cur & SB)){
if(hs == vec[cur]) ans += cur - l + 1;
cur++;
}
while(cur + BL <= r){
ans += seg[cur / BL][hs] + cnt[cur / BL][hs] * (ll)(cur - l);
cur += BL;
}
while(cur < r){
if(hs == vec[cur]) ans += cur - l + 1;
cur++;
}
cout << ans << '\n';
}
}
}