#include #include typedef unsigned int uint; inline uint bit_count(uint i) { i = (i & 0x55555555) + ((i >> 1) & 0x55555555); i = (i & 0x33333333) + ((i >> 2) & 0x33333333); i = (i & 0x0f0f0f0f) + ((i >> 4) & 0x0f0f0f0f); i = (i & 0x00ff00ff) + ((i >> 8) & 0x00ff00ff); i = (i & 0x0000ffff) + ((i >> 16)& 0x0000ffff); return i; } int main() { std::ifstream fin("jurassic.in"); int n; while(fin >> n && n != 0) { uint bits[24]; for(int i = 0; i < n; i++) { std::string s; fin >> s; bits[i] = 0; for(int j = 0; j < (int)s.size(); j++) { bits[i] |= 1 << (s[j] - 'A'); } } int result = 0; int result_bits = 0; uint bits_acc[24+1]; bits_acc[0] = 0; for(int i = 0; i < 24; i++) { bits_acc[i+1] = bits_acc[i] ^ bits[i]; } uint c_bits = 0; for(int p = 1; p < (1 << n); p++) { int diff = bit_count(p ^ (p - 1)); c_bits ^= bits_acc[diff]; if (c_bits == 0) { int m = bit_count(p); if (m > result_bits) { result = p; result_bits = m; } } //std::cout << diff << ' ' << bits_acc[diff] << std::endl; } bool first = true; std::cout << result_bits << std::endl; for(int i = 0; i < n; i++) { if ((result & (1 << i)) != 0) { if (!first) std::cout << ' '; std::cout << (i+1); first = false; } } std::cout << std::endl; } return 0; }