#include #include using namespace std; char consensus (char a, char b, char c){ return (a == b && b == c && c != '.') ? c : 0; } bool Valid (const string &s){ int numXs = 0, numOs = 0; for (int i = 0; i < s.length(); i++){ if (s[i] == 'X') numXs++; if (s[i] == 'O') numOs++; } char r1 = consensus (s[0], s[1], s[2]); char r2 = consensus (s[3], s[4], s[5]); char r3 = consensus (s[6], s[7], s[8]); char c1 = consensus (s[0], s[3], s[6]); char c2 = consensus (s[1], s[4], s[7]); char c3 = consensus (s[2], s[5], s[8]); char d1 = consensus (s[0], s[4], s[8]); char d2 = consensus (s[2], s[4], s[6]); // no two parallel row/columns can have three-in-a-row if (r1 && r2 || r1 && r3 || r2 && r3) return false; if (c1 && c2 || c1 && c3 || c2 && c3) return false; // draw is possible only if X makes 5 marks and O makes 4 marks if (!(r1 || r2 || r3 || c1 || c2 || c3 || d1 || d2) && (numXs != 5 || numOs != 4)) return false; // if O wins, then both make the same number of marks if ((r1=='O' || r2=='O' || r3=='O' || c1=='O' || c2=='O' || c3=='O' || d1=='O' || d2=='O') && numXs != numOs) return false; // if X wins, then X has one more mark than O if ((r1=='X' || r2=='X' || r3=='X' || c1=='X' || c2=='X' || c3=='X' || d1=='X' || d2=='X') && numXs != numOs + 1) return false; return true; } int main(){ while (true){ string s; getline (cin, s); if (s == "end") break; cout << (Valid (s) ? "valid" : "invalid") << endl; } }