結果
| 問題 |
No.2265 Xor Range Substring Sum Query
|
| コンテスト | |
| ユーザー |
Nachia
|
| 提出日時 | 2023-04-07 22:07:50 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 966 ms / 5,000 ms |
| コード長 | 2,672 bytes |
| コンパイル時間 | 960 ms |
| コンパイル使用メモリ | 85,220 KB |
| 最終ジャッジ日時 | 2025-02-12 01:29:20 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 22 |
ソースコード
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <atcoder/modint>
using namespace std;
using i32 = int;
using u32 = unsigned int;
using i64 = long long;
using u64 = unsigned long long;
#define rep(i,n) for(int i=0; i<(int)(n); i++)
const i64 INF = 1001001001001001001;
using Modint = atcoder::static_modint<998244353>;
int main(){
int N;
string S;
cin >> N >> S;
vector<int> Sval(1<<N);
rep(i,1<<N) Sval[i] = S[i] - '0';
int n = N/2;
vector<Modint> pow10((1<<N)+1);
pow10[0] = 1; rep(i,1<<N) pow10[i+1] = pow10[i] * 11;
vector<Modint> pow2((1<<N)+1);
pow2[0] = 1; rep(i,1<<N) pow2[i+1] = pow2[i] * 2;
const int SZ = 1 << (N-n);
const int MASK = SZ - 1;
vector<vector<Modint>> micro(1<<n, vector<Modint>(SZ));
rep(i,1<<n){
rep(j,SZ) micro[i][j] = Sval[(i<<(N-n))+j];
rep(d,N-n) rep(j,SZ) if(!(j&(1<<d))){
auto& a = micro[i][j];
auto& b = micro[i][j|(1<<d)];
Modint ab = a * pow10[1<<d] + b * pow2[1<<d];
Modint ba = a * pow2[1<<d] + b * pow10[1<<d];
a = ab;
b = ba;
}
}
auto naive = [&](int l, int r, int x) -> Modint {
Modint ans;
for(int i=l; i<r; i++){
ans += Modint::raw(Sval[i^x]) * pow2[i-l] * pow10[r-1-i];
}
return ans;
};
int Q; cin >> Q;
rep(q,Q){
int t; cin >> t;
if(t == 1){
int x, y; cin >> x >> y;
y -= Sval[x]; Sval[x] += y;
Modint dy = y;
int i = x >> (N-n);
auto iter = micro[i].begin();
int xx = x & MASK;
rep(j,SZ) iter[j] += dy * pow2[xx^j] * pow10[SZ-1-(xx^j)];
}
else if(t == 2){
int l, r, x; cin >> l >> r >> x; r++;
Modint ans = 0;
if(r - l <= SZ * 2){
ans = naive(l, r, x);
}
else{
int lv = (l + (SZ - 1)) >> (N-n);
int rv = r >> (N-n);
int lowmask = x & MASK;
int himask = x >> (N-n);
ans += naive(l, lv << (N-n), x) * pow10[r - (lv << (N-n))];
for(int d=lv; d<rv; d++){
ans += micro[d^himask][lowmask] * pow2[(d<<(N-n))-l] * pow10[r-((d+1)<<(N-n))];
}
ans += naive(rv << (N-n), r, x) * pow2[(rv << (N-n)) - l];
}
cout << ans.val() << '\n';
}
}
return 0;
}
struct ios_do_not_sync{
ios_do_not_sync(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
}
} ios_do_not_sync_instance;
Nachia