A. Kalevitch and Chess
全部塗られている場合を除き,塗り方は一意で,$8$ 個ある行や列はすべて塗る必要があります.
B. Memory Manager
読解ができれば愚直シミュレーションです.
- 長さ $N$ の配列を管理してください.
- alloc:はじめて連続 $n$ 個が $0$ である場所を見つけてください(なかったら NULL を出力).そこに p 番目の alloc である場合 $p$ を書き込んで,$p$ を出力してください.
- erase:$x$ があればそれをすべて削除してください.なければ ILLEGAL … を出力してください.
- defragment:$0$ でない要素を左から詰めて再構築してください.
C. Line
互除法により $ax+by=\gcd(a,b)$ の解が見つけられ,その定数倍から $ax+by=c$ の解があれば見つけられます.
D. Palindrome Degree
Manacher などを用いて,各 $[L,R)$ が回文であるかどうかの判定ができるようにしておきます.あとは各 prefix について順に定義通りに(小さい場合の結果を使いながら計算します.
E. Defining Macros
読解ができずにかなりつらかったですが.雰囲気読解に頼った方が簡単な気がします.
guided by arithmetic rules of brackets expansion, we can omit some of the brackets.
あたりが良く分からないですが,たぶん,「同じ優先度の演算をなるべくカッコが少なく書く」というような定義をする気がします?
$(a+b)-(c-d)+(e+f)$ は $a+b-c+d+e+f$ とする,というような感じかなと.
解法ですが,各マクロについて,最後に行っている演算の優先度だけが問題です.特に各マクロは
- a:変数,定数,またはカッコで挟まれた何か
- a + b:複数の項に対して最後に $+, -$ のどちらかの優先度の演算を行っている.
- a * b:複数の項に対して最後に $+, -$ のどちらかの優先度の演算を行っている.
- unsafe:中で呼ばれるマクロも含めてどこかで unsafe
の $4$ 種のどれであるかだけが重要で,このどれかを判定する再帰関数で構文解析すればよいです.
演算との間にスペースがあったりなかったりしますが,最初に “+” を ” + ” に置換するなどしてあらゆる場所にスペースを挿入したあと,スペースがたくさん並ぶところのスペースを省略する形で実装しま
” # define” みたいな入力が来るのも驚きです.問題文とサンプルからは読解方法がないと思いますが,Input のところをよく読むとちゃんと書いてあります.