結果
| 問題 |
No.2265 Xor Range Substring Sum Query
|
| コンテスト | |
| ユーザー |
とりゐ
|
| 提出日時 | 2023-03-10 11:11:36 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 4,375 ms / 5,000 ms |
| コード長 | 1,682 bytes |
| コンパイル時間 | 472 ms |
| コンパイル使用メモリ | 82,192 KB |
| 実行使用メモリ | 487,136 KB |
| 最終ジャッジ日時 | 2024-12-14 19:29:55 |
| 合計ジャッジ時間 | 71,127 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 22 |
ソースコード
from sys import stdin
input=lambda :stdin.readline()[:-1]
class non_commutative_xor_segment_tree:
def __init__(self,n,init,func,E):
self.n=n
self.N=1<<n
self.m=n//2
self.func=func
self.E=E
self.s=1<<self.m
self.node=[E]*self.N*(self.m+1)
for i in range(self.N):
self.node[i]=init[i]
for i in range(1,self.m+1):
for j in range(self.N):
self.merge(i,j)
def merge(self,i,j):
L=j
R=L^(1<<(i-1))
self.node[(i<<self.n)|j]=self.func(self.node[((i-1)<<self.n)|L],self.node[((i-1)<<self.n)|R])
def update(self,x,y):
self.node[x]=y
for i in range(1,self.m+1):
l=(x>>i)<<i
r=l+(1<<i)
for j in range(l,r):
self.merge(i,j)
def query(self,L,R,X):
R+=1
res=self.E
for i in range(self.m):
if (L>>i)&1 and L+(1<<i)<=R:
res=self.func(res,self.node[(i<<self.n)|L^X])
L+=1<<i
while L+self.s<=R:
res=self.func(res,self.node[(self.m<<self.n)|L^X])
L+=self.s
for i in range(self.m-1,-1,-1):
if L+(1<<i)<=R:
res=self.func(res,self.node[(i<<self.n)|L^X])
L+=1<<i
return res
mod=998244353
n=int(input())
S=input()
N=1<<n
pow11=[1]*N
pow2=[1]*N
for i in range(1,N):
pow11[i]=pow11[i-1]*11%mod
pow2[i]=pow2[i-1]*2%mod
def op(L,R):
res0=L[0]*pow11[R[1]]+R[0]*pow2[L[1]]
res1=L[1]+R[1]
return (res0%mod,res1)
seg=non_commutative_xor_segment_tree(n,[(int(S[i]),1) for i in range(1<<n)],op,(0,0))
q=int(input())
for _ in range(q):
query=list(map(int,input().split()))
if query[0]==1:
x,y=query[1:]
seg.update(x,(y,1))
else:
L,R,X=query[1:]
print(seg.query(L,R,X)[0])
とりゐ