毎日格上の問題を倒すやつの33日目です。
問題リンク
問題概要
「数列 を 回シフトしてから一様に をxorしたら に一致する」ような の組をすべて求めてね。
解法
いつものbitごとに考えるあれです。
各bitごとにみると、シフトはローリングハッシュみたいなことをすればできます。
一様にxorして一致するかは、元のものと反転バージョンを両方用意して一致判定すればいいです。
ハッシュの衝突だけ注意…*1
提出コード
from random import randint MOD=pow(2,61)-1 BASE=randint(3,MOD) N=int(input()) fin=pow(BASE,N-1,MOD) a=list(map(int,input().split())) b=list(map(int,input().split())) ans=[0]*N for i in range(30): hash_a=0 hash_rv=0 hash_b=0 for j in range(N): hash_a*=BASE hash_b*=BASE hash_rv*=BASE hash_a+=(a[j]>>i)&1 hash_b+=(b[j]>>i)&1 hash_rv+=((a[j]>>i)&1)^1 hash_a%=MOD hash_b%=MOD hash_rv%=MOD for j in range(N): if hash_b==hash_rv: ans[j]+=1<<i elif hash_b!=hash_a: ans[j]=-1 hash_a-=fin*((a[j]>>i)&1) hash_rv-=fin*(((a[j]>>i)&1)^1) hash_a*=BASE hash_rv*=BASE hash_a+=(a[j]>>i)&1 hash_rv+=((a[j]>>i)&1)^1 hash_a%=MOD hash_rv%=MOD for j in range(N): if ans[j]!=-1: print(j,ans[j])
Submission #46868012 - AtCoder Beginner Contest 150
感想
精選150問で見たやつ、今見ると瞬殺できて楽しい
空いてた日にやってたこと
24日目
【今日の精進】
— はるく@競プロ (@halc_kyopro) 2023年10月14日
ABC224 - Roll or Increment
公式解説と違う方法で解いて解説書いたけど未証明です(え?)
提出 #46503447 - AtCoder Beginner Contest 224 https://t.co/8bGK6hx35B
25日目
【今日の精進】
— はるく@競プロ (@halc_kyopro) 2023年10月15日
ABC242F - Black and White Rooks
組み合わせの問題はやっぱ考えてて楽しいわ_最新
提出 #46604585 - AtCoder Beginner Contest 242 https://t.co/hmtVQN9OCr
26日目
【今日の精進】
— はるく@競プロ (@halc_kyopro) 2023年10月16日
AGC027C - ABland Yard
何気にこのシリーズではAGC初なんだよね…
提出 #46649265 - AtCoder Grand Contest 027 https://t.co/2100ioS7KY
27日目
【今日の精進】
— はるく@競プロ (@halc_kyopro) 2023年10月17日
ABC229G - Longest Y
こういうシンプルな見た目の問題好き
提出 #46674803 - NECプログラミングコンテスト2021(AtCoder Beginner Contest 229) https://t.co/Tn9WLmqh6g
28日目
【今日の精進】
— はるく@競プロ (@halc_kyopro) 2023年10月18日
ABC172F - Unfair Nim
XORで桁DPを疑うの大事な気がしてきた
提出 #46699081 - AtCoder Beginner Contest 172 https://t.co/uI747uYPrb
29日目
【今日の精進】
— はるく@競プロ (@halc_kyopro) 2023年10月19日
ABC182F - Valid payments
昔解説ACした問題の解説を見ながら解いた(???)
提出 #46724945 - AtCoder Beginner Contest 182 https://t.co/cLrlZnCxhb
30日目
【今日の精進】
— はるく@競プロ (@halc_kyopro) 2023年10月19日
ABC260G - Scalene Triangle Area
ほぼJOIの釘と同じ問題だったからわかりやすいね
提出 #46749465 - AtCoder Beginner Contest 260 https://t.co/95t888DXb1
31日目
【今日の精進】
— はるく@競プロ (@halc_kyopro) 2023年10月21日
Codeforces Round 901 (Div.1)
A...明らかに、自分の最小と相手の最大を交換するか何もしないかのどちらかが最適。
また、100回目くらいで最大と最小を交換し合うだけになるので、最初の100回くらいはまじめにやってあとははしょる
32日目
【今日の精進】
— はるく@競プロ (@halc_kyopro) 2023年10月22日
Codeforces Round 896 (Div. 1)
A...n=1とm=1のときはめんどいから先に処理
まず答えはmin(n+1,m)
あとはnとmの大小によって適当に構築すればいいが、丁寧な実装をしないといけない