#include <stdio.h>
int M; char S[3][3010];
bool clause[52][52][52];
int C, V[3][8008];
int trans(char s)
{
if ('a' <= s && s <= 'z') return (s - 'a') * 2 + 1;
return (s - 'A') * 2;
}
void addclause(char a, char b, char c)
{
int i = trans(a), j = trans(b), k = trans(c), t;
if (i > j) t = i, i = j, j = t;
if (i > k) t = i, i = k, k = t;
if (j > k) t = j, j = k, k = t;
clause[i][j][k] = 1;
}
bool end; int sw[26];
inline bool sat(int x)
{
return x % 2 == sw[x / 2];
}
void go(int a)
{
while (a < C){
if (sat(V[0][a]) || sat(V[1][a]) || sat(V[2][a])) a++;
else break;
}
if (a == C){
end = 1;
}
else{
int last[3];
for (int k = 0; k < 3; k++) last[k] = sw[V[k][a] / 2];
for (int k = 0; k < 3; k++){
if (last[k] != 2) continue;
sw[V[k][a] / 2] = V[k][a] % 2;
go(a + 1);
if (end) return;
sw[V[k][a] / 2] = 1 - sw[V[k][a]/2];
}
for (int k = 0; k < 3; k++) sw[V[k][a] / 2] = last[k];
}
}
int main()
{
while (scanf("%d", &M) && M){
for (int i = 0; i < 3; i++) scanf("%s", S[i]);
for (int i = 0; i < M; i++){
for (int p = 1; p <= 2; p++) for (int q = 1; q <= 2; q++) for (int r = 1; r <= 2; r++){
addclause(S[0][3 * i + p], S[1][3 * i + q], S[2][3 * i + r]);
}
}
C = 0;
for (int i = 0; i < 52; i++) for (int j = i; j < 52; j++) for (int k = j; k < 52; k++) if (clause[i][j][k]){
V[0][C] = i;
V[1][C] = j;
V[2][C] = k;
C++;
clause[i][j][k] = 0;
}
for (int i = 0; i < 26; i++) sw[i] = 2;
end = 0;
go(0);
if (end){
int on = 0;
for (int i = 0; i < 26; i++) if (sw[i] == 1) on++;
printf("%d", on);
for (int i = 0; i < 26; i++) if (sw[i] == 1) printf(" %c", i + 'A');
puts("");
}
else puts("-1");
}
return 0;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:53:48: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
for (int i = 0; i < 3; i++) scanf("%s", S[i]);
^