結果
| 問題 |
No.3239 Omnibus
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-08-16 00:14:52 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 616 ms / 10,000 ms |
| コード長 | 1,820 bytes |
| コンパイル時間 | 2,074 ms |
| コンパイル使用メモリ | 198,968 KB |
| 実行使用メモリ | 57,204 KB |
| 最終ジャッジ日時 | 2025-08-16 00:15:09 |
| 合計ジャッジ時間 | 16,664 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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), cnt(bsz);
auto get = [&](int p){
int hs = ((s[p] - 'a') * 26 + (s[p + 1] - 'a')) * 26 + (s[p + 2] - 'a');
return hs;
};
auto add = [&](int p, int d){
int hs = get(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]--;
}
};
for(int i = 0; i + 3 <= n; i++) add(i, 1);
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--) add(i, 1);
}else{
int l, r, hs;
ll ans = 0;
string s;
cin >> l >> r >> s;
hs = (((s[0] - 'a') * 26) + (s[1] - 'a')) * 26 + s[2] - 'a';
l--, r -= 2;
int cur = l;
while(cur < r && (cur & SB)){
if(hs == get(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 == get(cur)) ans += cur - l + 1;
cur++;
}
cout << ans << '\n';
}
}
}