TopCoder SRM 539 Div2 Hard CaptureFish
問題
直線上にN個のブイがあり、ブイとブイの間に一匹ずつ魚がいる。
魚にはそれぞれ'O', 'X', '*'の文字が割り振られている。
この魚を次のように網で囲う。
- 網は自己交差のない閉曲線で表される。
- 網は直線と、ブイの点のみで交わる。
- ブイで直線と網が交わったとき、同じ側へ網が戻らない。
- Oの文字が割り振られた魚は全て網の同じ側に、Xの文字が割り振られた魚はOの文字の魚とは反対側の網の全て同じ側にいなければならない。
魚を網で囲う方法は偶数か奇数か答えよ。
制約条件
魚の数≦50
方針
上下対称な魚の囲い方が奇数通りあれば、求める数は奇数。
上下対称な魚の囲い方は、連続する魚i≦x<jを囲う囲い方のみ。
それぞれの囲い方がvalidかどうかを見て、validなものだけ数える。
ソースコード
class CaptureFish { public: int getParity(string fish) { int n = fish.size(), ans = 0; rep(i,n) for(int j = i+1; j <= n; j++){ bool out[2] = {}, in[2] = {}; rep(k,n){ if(i <= k && k < j){ if(fish[k] == 'O') in[0] = 1; if(fish[k] == 'X') in[1] = 1; } else{ if(fish[k] == 'O') out[0] = 1; if(fish[k] == 'X') out[1] = 1; } } if(in[0] && in[1] || out[0] && out[1]) continue; if(in[0] && out[0] || in[1] && out[1]) continue; ans ^= 1; } return ans; } };