using int64 = longlong; using uint64 = unsignedlonglong; using uint32 = unsignedint;
structstate { uint32 u;
inlineconstexprstate(uint32 u) : u(u) {} inlineconstexproperatoruint32()const{ return u; } inlineconstexprstate(const std::string& str) : u(0) { for (int i = 0; i < 9; i++) { uint32 val = 0; if (str[i] == 'x') { val = 1; } elseif (str[i] == 'o') { val = 2; } else { val = 0; } u |= val << (i * 2); } }
intcheck_win(); inlineconstexprintget(int idx)const{ return (u >> (idx * 2)) & 0x3; } inlineconstexprvoidset(int idx, int val){ u &= ~(0x3 << (idx * 2)); u |= uint32(val) << (idx * 2); } };
inline state final_state[] = { state("xxx "), state(" xxx "), state(" xxx"), state("x x x "), state(" x x x "), state(" x x x"), state("x x x"), state(" x x x "), };
inlineintstate::check_win(){ for (int i = 0; i < 8; i++) { if ((final_state[i].u & u) == final_state[i].u) return1; if (((final_state[i].u << 1) & u) == (final_state[i].u << 1)) return-1; } return0; }