結果
問題 |
No.2554 MMA文字列2 (Query Version)
|
ユーザー |
![]() |
提出日時 | 2025-02-23 12:15:24 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 2,201 ms / 5,000 ms |
コード長 | 1,127 bytes |
コンパイル時間 | 324 ms |
コンパイル使用メモリ | 82,284 KB |
実行使用メモリ | 278,208 KB |
最終ジャッジ日時 | 2025-02-23 12:17:03 |
合計ジャッジ時間 | 79,646 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 55 |
ソースコード
n=int(input()) L=1<<16 k=26 def op(x,y): z=[0]*(k+k+1) for i in range(k+k+1): z[i]=x[i]+y[i] c=0 for i in range(k): c+=x[i]*(x[i]-1)//2 for i in range(k): z[-1]+=(c-x[i]*(x[i]-1)//2)*y[i] for i in range(k): z[-1]+=x[i]*y[k+i] c=0 for i in range(k): c+=y[i] for i in range(k): z[k+i]+=x[i]*(c-y[i]) return z q=[[0]*(k+k+1) for i in range(L*2)] s=input() for i in range(n): p=L+i q[p][ord(s[i])-ord("A")]=1 p//=2 while p>0: q[p]=op(q[p*2+0],q[p*2+1]) p//=2 Q=int(input()) for _ in range(Q): t,p1,p2=input().split() t=int(t) if t==1: c=p2 p=L+int(p1)-1 q[p]=[0]*(k+k+1) q[p][ord(c)-ord("A")]=1 p//=2 while p>0: q[p]=op(q[p*2+0],q[p*2+1]) p//=2 if t==2: l=L+int(p1)-1 r=L+int(p2)-1 pl=[] pr=[] while l<=r: if l%2==1: pl+=[l] l+=1 if r%2==0: pr+=[r] r-=1 l//=2 r//=2 if len(pl)>0 and len(pr)>0 and pl[-1]==pr[-1]: pr.pop() a=[0]*(k+k+1) for p in pl: a=op(a,q[p]) for p in pr[::-1]: a=op(a,q[p]) print(a[-1])