Problem
各文字列に対してパターンマッチをする。ifで分岐してマッチしたら出力してreturnという形式にもできる。
A:submission
Problem
かなり悩んだ。Rustで解いていると配列の範囲外アクセス、添字をマイナスにする、usizeで取得した数値が負にできないなど様々な制約があったためそこでどうやった解けばいいか分からず苦戦していたが、制約がせいぜい20x20程度だったため70x70の大きい二次元ベクタを作りそこの中心に取得したものをコピーし、書き換える時はその二次元配列上で行う、といった操作を行なった。その結果配列の範囲外アクセスや添え字がマイナスになったりすることはなかったためAC。開始から88分後のACであった為先にCを解いたのはかなりいい判断だった。
B:submission
Problem
なんか色々書いてあるが、数列を線形探索した時偶数回でてきた数字をその回数分だけ足せば良い。状態としては「片っぽだけある」と「一個もない」の2種しかないためHashSetで状態を管理していれば良い。setに含まれていたらremoveして+1,含まれていなかったらinsert。
C:submission
Problem
まず入力Sについて1文字ずつ処理するため関数を用意してCharsをusizeのベクタにparseした。そしてどの数字が奇数回出現しているかを判定するためのベクタ(可変長のため普通の配列でも可)のdpを用意した。0~9までを表現したいため10bitの長さの配列にする必要がある。任意の添え字iについてiを2進数表記した時q番目に立っているbitの集まりが偶数回出現した数の集合を表している。0で初期化した添え字を表すplaceに対して1をiビットシフトしたものとのXORを取る。placeを0で初期化しているためdp[0]を+1する処理を最初にしておく。桁の数だけ繰り返しを回すがplaceを添え字にとり、dp[place]の値を答えを格納するresultに足す。
足した後resultをインクリメントする。これは次同じ場所を訪問した時、訪問するまでの数が偶数回出現していることを表す(すなわち嬉しい列の条件を満たす)ためである。最終的なresultの値を出力する。
長々と書いたがこれは0~lまでに奇数回出現した数の集合とl~rまで(l<=r)に出現した数の集合が一致していればl~rないの全ての数が偶数回出現している、という性質をbitを使って実装したものである。
D:submission