Submission #2915336


Source Code Expand

#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;
}

Submission Info

Submission Time
Task J - Magical Switches
User clatisus
Language C++14 (GCC 5.4.1)
Score 100
Code Size 1803 Byte
Status AC
Exec Time 71 ms
Memory 384 KB

Compile Error

./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]);
                                                ^

Judge Result

Set Name all
Score / Max Score 100 / 100
Status
AC × 1
Set Name Test Cases
all Merged
Case Name Status Exec Time Memory
Merged AC 71 ms 384 KB