#include #include using namespace std; int bones[24]; int N; int n_best_bones; bool best_bones[24]; void recursive(int unused_joints, int depth, bool used_bones[24], int n_used_bones) { if (unused_joints == 0 && n_best_bones < n_used_bones) { n_best_bones = n_used_bones; for (int i = 0; i < 24; i++) { best_bones[i] = used_bones[i]; } } if (depth >= N || n_used_bones + (N - depth) <= n_best_bones) { return; } used_bones[depth] = true; recursive(unused_joints ^ bones[depth], depth + 1, used_bones, n_used_bones + 1); used_bones[depth] = false; recursive(unused_joints , depth + 1, used_bones, n_used_bones); } int main() { while (cin >> N && N > 0) { string s; getline(cin, s); for (int i = 0; i < N; i++) { getline(cin, s); bones[i] = 0; for (int j = 0; j < s.length(); j++) { bones[i] |= 1 << (int)(s[j] - 'A'); } } bool used_bones[24]; for (int i = 0; i < 24; i++) { best_bones[i] = used_bones[i] = false; } n_best_bones = 0; recursive(0, 0, used_bones, 0); cout << n_best_bones << endl; bool first = true; for (int i = 0; i < N; i++) { if (best_bones[i]) { if (first) { first = false; } else { cout << " "; } cout << (i + 1); } } cout << endl; } return 0; }