西瓜の備忘録

競プロとかで気づいたこととか考察を書き留めるためのブログ

競プロで頻出の初歩的な(?)テクニック

使い所は多いけれど説明・紹介されることはあまりないようなテクニックのメモ

 

ほぼ全ての言語で使えるもの

整数での切り捨て切り上げ

自然数A,Bで除算をするとき、大半の言語では切り捨てられることを利用するテク

ex) 切り捨て A/B

切り上げ (A+B-1) / B

bit演算とか

1 << n は1をn回左シフトした数を表す、つまり2^nと等しい

また、x & (1 << n)とすることによってxの(下から数えて)nビット目が立っているかどうかを調べることもできる

x & -xはxの一番下に立っているビットを表す(なぜそうなるのかは2の補数でggってください)

よって x / (x & -x)とするとxを2で割れるだけ割った数が得られる

最後に続いている0の数。NLZ(x) = count_bits( (x & (-x) )-1)

最初に続いている0の数。NTZ(x) = 32 - NLZ( (~x) & (x-1) )

動作が処理系によるもの(ここではC++で考える)

 文字で演算

C,C++では文字コードはASCIIを使っているので1byte変数として扱うこともできる

この文字コードでなくても(文字が連続しているならば)基本的に演算はできる

例えば

int cnt[26];

cnt[c - 'a']++;//cは小文字のアルファベット

のようにすればa,b,c...に0,1,2...を対応させてそれぞれの文字に対して数え上げなどができる