记录编号 |
451441 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2004]虫食算 |
最终得分 |
100 |
用户昵称 |
Cooook |
是否通过 |
通过 |
代码语言 |
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;
}