結果
問題 |
No.3239 Omnibus
|
ユーザー |
|
提出日時 | 2025-08-15 23:14:20 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
MLE
|
実行時間 | - |
コード長 | 5,266 bytes |
コンパイル時間 | 3,441 ms |
コンパイル使用メモリ | 303,372 KB |
実行使用メモリ | 813,824 KB |
最終ジャッジ日時 | 2025-08-15 23:14:28 |
合計ジャッジ時間 | 6,379 ms |
ジャッジサーバーID (参考情報) |
judge6 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 3 MLE * 1 -- * 29 |
ソースコード
#include <bits/stdc++.h> #define fi first #define se second #define rep(i,s,n) for (int i = (s); i < (n); ++i) #define rrep(i,n,g) for (int i = (n)-1; i >= (g); --i) #define all(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define len(x) (int)(x).size() #define dup(x,y) (((x)+(y)-1)/(y)) #define pb push_back #define eb emplace_back #define Field(T) vector<vector<T>> using namespace std; using ll = long long; using ull = unsigned long long; template<typename T> using pq = priority_queue<T,vector<T>,greater<T>>; using P = pair<int,int>; template<class T>bool chmax(T&a,T b){if(a<b){a=b;return 1;}return 0;} template<class T>bool chmin(T&a,T b){if(b<a){a=b;return 1;}return 0;} template<typename T> struct BIT { int n; vector<T> d; BIT () = default; BIT (int n_) : n(n_ + 1), d(n, 0) {} void add(int i, T x) { ++i; for (int idx = i; idx < n; idx += (idx & -idx)) { d[idx] += x; } } T sum(int i) { ++i; T s(0); for (int idx = i; idx > 0; idx -= (idx & -idx)) { s += d[idx]; } return s; } T sum(int l, int r) { return sum(r-1) - sum(l-1); } // min_k {sum[i = 0 -> k] a_k >= w} int lower_bound(T w) { if (w <= 0) { return 0; } else { int x = 0, r = 1; while(r < n) r <<= 1; for (int l = r; l > 0; l >>= 1) { if (x + l < n && d[x + l] < w) { w -= d[x + l]; x += l; } } return x; } } }; int main() { int n, q; string s0; cin >> n >> q >> s0; vector<int> s(n); rep(i,0,n) s[i] = s0[i]-'a'; int m = 17576; vector<set<int>> st(m); rep(i,0,n-2) { int val = s[i]*676+s[i+1]*26+s[i+2]; st[val].emplace(i); } vector<int> t(q), k(q), x(q), l(q), r(q), a(q); vector<int> u = s; rep(i,0,q) { cin >> t[i]; if (t[i] == 1) { char c; cin >> k[i] >> c; --k[i], x[i] = (c-'a'); if (k[i] >= 2) { int nval = u[k[i]-2]*676+u[k[i]-1]*26+x[i]; st[nval].emplace(k[i]-2); } if (1 <= k[i] && k[i] < n-1) { int nval = u[k[i]-1]*676+x[i]*26+u[k[i]+1]; st[nval].emplace(k[i]-1); } if (k[i] < n-2) { int nval = x[i]*676+u[k[i]+1]*26+u[k[i]+2]; st[nval].emplace(k[i]); } u[k[i]] = x[i]; } else { cin >> l[i] >> r[i]; --l[i]; string ti; cin >> ti; a[i] = (ti[0]-'a')*676+(ti[1]-'a')*26+(ti[2]-'a'); } } vector<map<int,int>> mp(m); vector<BIT<ll>> bit1(m); vector<BIT<int>> bit2(m); rep(i,0,m) { if (st[i].empty()) continue; int j = 0; for (int e : st[i]) { mp[i][e] = j++; } bit1[i] = BIT<ll>(len(st)); bit2[i] = BIT<int>(len(st)); } rep(i,0,m) st[i].emplace(n); vector<set<int>> ids(m); rep(i,0,n-2) { int val = s[i]*676+s[i+1]*26+s[i+2]; ids[val].emplace(i); bit1[val].add(mp[val][i], i); bit2[val].add(mp[val][i], 1); } // rep(i,0,m) if (!mp[i].empty()) { // cout << i << " " << char('a'+(i/676)) << char('a'+((i/26)%26)) << char('a'+i%26) << " -> "; // rep(j,0,len(mp[i])) { // cout << bit1[i].sum(j, j+1) << " "; // } // cout << endl; // } rep(i,0,q) { if (t[i] == 1) { if (k[i] >= 2) { int val = s[k[i]-2]*676+s[k[i]-1]*26+s[k[i]]; ids[val].erase(k[i]-2); bit1[val].add(mp[val][k[i]-2], -(k[i]-2)); bit2[val].add(mp[val][k[i]-2], -1); int nval = s[k[i]-2]*676+s[k[i]-1]*26+x[i]; ids[nval].emplace(k[i]-2); bit1[nval].add(mp[nval][k[i]-2], k[i]-2); bit2[nval].add(mp[nval][k[i]-2], 1); } if (1 <= k[i] && k[i] < n-1) { int val = s[k[i]-1]*676+s[k[i]]*26+s[k[i]+1]; ids[val].erase(k[i]-1); bit1[val].add(mp[val][k[i]-1], -(k[i]-1)); bit2[val].add(mp[val][k[i]-1], -1); int nval = s[k[i]-1]*676+x[i]*26+s[k[i]+1]; ids[nval].emplace(k[i]-1); bit1[nval].add(mp[nval][k[i]-1], k[i]-1); bit2[nval].add(mp[nval][k[i]-1], 1); } if (k[i] < n-2) { int val = s[k[i]]*676+s[k[i]+1]*26+s[k[i]+2]; ids[val].erase(k[i]-1); bit1[val].add(mp[val][k[i]], -k[i]); bit2[val].add(mp[val][k[i]], -1); int nval = x[i]*676+s[k[i]+1]*26+s[k[i]+2]; ids[nval].emplace(k[i]); bit1[nval].add(mp[nval][k[i]], k[i]); bit2[nval].add(mp[nval][k[i]], 1); } s[k[i]] = x[i]; } else { // cout << l[i] << " " << r[i] << " " << a[i] << endl; if (r[i]-l[i] <= 2 || mp[a[i]].empty()) { cout << 0 << endl; continue; } int sl = *st[a[i]].lower_bound(l[i]), sr = *st[a[i]].lower_bound(r[i]-2); // cout << sl << " " << sr << endl; if (sl == n) { cout << 0 << endl; continue; } sl = mp[a[i]][sl], sr = (sr == n ? len(mp[a[i]]) : mp[a[i]][sr]); // cout << sl << " " << sr << endl; ll ans = bit1[a[i]].sum(sl, sr); ans -= 1LL*(l[i]-1)*bit2[a[i]].sum(sl, sr); cout << ans << endl; } } // rep(i,0,m) if (!mp[i].empty()) { // cout << char('a'+(i/676)) << char('a'+((i/26)%26)) << char('a'+i%26) << " -> "; // rep(j,0,len(mp[i])) { // cout << bit1[i].sum(j, j+1) << " "; // } // cout << endl; // } return 0; }