记录编号 442775 评测结果 AAAAWAAAWW
题目名称 [NOIP 2004]虫食算 最终得分 70
用户昵称 GravatarImone NOI2018Au 是否通过 未通过
代码语言 C++ 运行时间 10.544 s
提交时间 2017-08-28 16:08:59 内存使用 0.29 MiB
显示代码纯文本
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

typedef int matrix[27][27];
inline bool gauss(matrix M, int n) {
	int i, r, c;
	for(i=0;i<n;i++) {
		r = i;
		while(!M[r][i] && r < n) r++;
		if(!M[r][i]) return 0;
		if(r != i) for(c=i;c<=n;c++) swap(M[r][c], M[i][c]);
		
		int t = M[i][i];
		for(r=i+1;r<n;r++) {
			int p = M[r][i];
			for(c=i;c<=n;c++) M[r][c] = M[r][c] * t - M[i][c] * p;
		}
	}
	for(i=n-1;i>=0;i--) {
		for(c=i+1;c<n;c++) M[i][n] -= M[i][c] * M[c][n];
		M[i][n] /= M[i][i];
	}
	return 1;
}

int N;
const int MAXN = 30;
char A[MAXN], B[MAXN], C[MAXN];
bool vis[MAXN];
matrix M;

inline void rev(char *s) {
	int i;
	for(i=0;i<N/2;i++) swap(s[i], s[N-i-1]);
	for(i=0;i<N;i++) s[i] -= 'A';
}

int main() {
	freopen("alpha.in", "rt", stdin);
	freopen("alpha.out", "wt", stdout);

	scanf("%d%s%s%s", &N, A, B, C);
	rev(A); rev(B); rev(C);

	int i, set, full = (1 << (N - 1)) - 1;
	for(set=0;set<=full;set++) {
		memset(M, 0, sizeof(M));
		for(i=0;i<N;i++) {
			if((set >> i) & 1) M[i][N] += N;
			if(i && ((set >> (i - 1)) & 1)) M[i][N] -= 1;
			
			M[i][A[i]]++;
			M[i][B[i]]++;
			M[i][C[i]]--;
		}
		if(gauss(M, N)) {
			bool ok = 1;
			memset(vis, 0, sizeof(vis));
			for(i=0;i<N;i++) {
				if(M[i][N] < 0 || M[i][N] >= N || vis[ M[i][N] ]) { ok = 0; break; }
				vis[ M[i][N] ] = 1;
			}
			if(ok) {
				for(i=0;i<N;i++) printf("%d ", M[i][N]);
				break;
			}
		}
	}
	return 0;
}