ProblemF悔しすぎる・・・
そんなこんなで他人のコードを見た後、うちらは何を間違えたのかなぁと思って自分たちのコードを読み直すと、最初の木の同形判定をするためのオペレータ部分
bool treeless(const Tree* lhs, const Tree* rhs) { if (lhs == NULL && rhs == NULL) return false; if (lhs == NULL && rhs != NULL) return true; if (lhs != NULL && rhs == NULL) return false; bool b = treeless(lhs->cmpleft, rhs->cmpleft); if (!(b && treeless(rhs->cmpleft, lhs->cmpleft))) return b; return treeless(rhs->cmpright, lhs->cmpright); }
での!=の条件に
if (!(b && treeless(rhs->cmpleft, lhs->cmpleft))) return b;
という怪しいコードを発見!
if (lhs == NULL && rhs == NULL) return false;
とtrueじゃなくてfalseだから、!=の条件は普通に
if (b != treeless(rhs->cmpleft, lhs->cmpleft)) return b;
と書かなきゃいけないし、あんなコードにする必要もないはず。
と思ってコンパイルして通してみたら、通った!!
あ、一行書き換えただけで通ったんですか・・・。
後10分あれば通せたかもって書いたけど、3分あればよかった・・・。
ほんと、今回は細かいミスに泣かされた大会だった・・・。
まぁこれも実力なんで、今後はこういうくだらないミスをしないようにコード書きなれようと思います。