记录编号 451441 评测结果 AAAAAAAAAA
题目名称 [NOIP 2004]虫食算 最终得分 100
用户昵称 GravatarCooook 是否通过 通过
代码语言 C++ 运行时间 0.034 s
提交时间 2017-09-17 17:22:38 内存使用 0.31 MiB
显示代码纯文本
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define MAXN 30ul
int n,now[MAXN],cnt,use[MAXN];char add1[MAXN],add2[MAXN],add_Ans[MAXN];bool vis[MAXN],used[MAXN];


template<typename _t>inline _t read(){_t x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-f;for(;isdigit(ch);ch=getchar())x=x*10+(ch^48);return x*f;}
inline bool Judge(){
	int add = 0;
	for(int i=n;i;i--){
		if(now[add1[i]]==-1||now[add2[i]]==-1||now[add_Ans[i]]==-1) add=-1;
		else{
			if(add==-1){
				if((now[add1[i]]+now[add2[i]])%n==now[add_Ans[i]]) add=(now[add1[i]]+now[add2[i]])/n;
				else if((now[add1[i]]+now[add2[i]]+1)%n==now[add_Ans[i]]) add=(now[add1[i]]+now[add2[i]]+1)/n;
				else return 0;
			}
			else if((now[add1[i]]+now[add2[i]]+add)%n==now[add_Ans[i]]) add=(now[add1[i]]+now[add2[i]]+add)/n;
			else return 0;
		}
	} return add != 1;
}
 
void dfs(int x){
	if(x == cnt+1){for(int i = 0;i<n;i++) printf("%d ",now[i]);exit(0);}
    for(int i = n-1;~i;i--) {now[use[x]] = i; if(!vis[i] && Judge()) vis[i] = 1,dfs(x+1),vis[i] = 0;} now[use[x]] = -1;
}
 
int main(){
	freopen("alpha.in","r",stdin); freopen("alpha.out","w",stdout);
	memset(now,-1,sizeof now); n = read<int>(); scanf("%s%s%s",add1+1,add2+1,add_Ans+1);
	for(int i = n;i;i--) {
		add1[i] -= 'A';add2[i] -= 'A';add_Ans[i] -= 'A';
		if(!used[add1[i]]) use[++cnt] = add1[i],used[use[cnt]] = 1;
		if(!used[add2[i]]) use[++cnt] = add2[i],used[use[cnt]] = 1;
		if(!used[add_Ans[i]]) use[++cnt] = add_Ans[i],used[use[cnt]] = 1;
	} dfs(1);
	return 0;
}