记录编号 451765 评测结果 AAAAAAAAAA
题目名称 [NOIP 2004]虫食算 最终得分 100
用户昵称 GravatarTroywar 是否通过 通过
代码语言 C++ 运行时间 0.311 s
提交时间 2017-09-18 12:07:09 内存使用 0.31 MiB
显示代码纯文本
#include<cstdio>
#include "cstdlib"
#include<map>
using namespace std;
 
int n;
inline void printing(char *x){ 
    for(int i=1;i<=n;i++)
        printf("%1d",x[i]);puts("");
}
char a[50],b[50],c[50];
int  d[50];
int num[50];
bool vis[50];
bool used[50];
map<int,int > mp;
 
inline int lowbit(int x){return x&(-x);}
inline bool Judging(int res){
    int x=0,t,p;
    for(int i=n;i;i--){
        if(vis[a[i]]){
            if(vis[b[i]]){
                if(vis[c[i]]){
                    t=num[a[i]]+num[b[i]];
                    if(t>=n)
                        t-=n;
                    if(t+1==n)
                        p=t+1-n;
                    else
                        p=t+1;
                    if(x==-1){
                        if(num[c[i]]!=t&&num[c[i]]!=p)
                            return false;
                        else
                            x=num[a[i]]+num[b[i]]>=n?1:-1;
                    }
                    else    {
              //          printf("tt");
                        if(num[c[i]]!=(x?p:t))
                            return false;
                        else
                            x=num[a[i]]+num[b[i]]+x>=n;
             //           printf("ss\n");
                    }
                }
                else{
                    t=num[a[i]]+num[b[i]];
                    if(t>=n)    t-=n;
                    p=t+1;p=p==n?0:p;
                    if(x==-1){
                        if(used[t]&&used[p])
                            return false;
                        else    
                            x=num[a[i]]+num[b[i]]>=n?1:num[a[i]]+num[b[i]]<n-1?0:-1;
                    }else{
                        if(used[x?p:t])
                            return false;
                        else    
                            x=num[a[i]]+num[b[i]]+x>=n;
                    }
                }
            }else{
                if(vis[c[i]]){//aY bN cY
                  //  printf("in");
                    t=num[c[i]]-num[a[i]];
                    if(t<0) t+=n;
                    p=t-1;
                    p=p<0?p+n:p;
             //       printf("t=%d p=%d\n",t,p);
                    if(x==-1){
                        if(used[t]&&used[p])
                            return false;
                    }else{
                        if(used[x?p:t])
                            return false;
                        else    
                            x=num[c[i]]<num[a[i]]+x;
                    }
               //     printf("out");
                }
                else{x=-1;continue;}
            }
        }else{
            if(vis[b[i]]&&vis[c[i]]){
                t=num[c[i]]-num[b[i]];
                t=t<0?t+n:t;
                p=t-1;
                p=p<0?p+n:p;
                if(x==-1){
                    if(used[t]&&used[p])
                        return false;            
                }else{
                    if(used[x?p:t])
                        return false;
                    else    
                        x=num[c[i]]<x+num[b[i]];
                }
            }
            else{ x=-1;continue;}
        }
    }
    return true;
}
inline void print(){
    for(int i=0;i<n;i++)
        printf("%d%c",num[i],i<n-1?' ':'\n');
  //  exit(0);
}
inline void dfs(int step,int res){
  //  printf("step=%d \n",step);
  //  print();
    if(!Judging(res))
    return ;
    if(step==n+1){
        print();
        exit(0);
    }    
 //   printf("step=%d \n",step);
 //   print();
    for(int i=res,j;i;i-=lowbit(i)){
        j=mp[lowbit(i)];
        used[j]=vis[d[step]]=true;
        num[d[step]]=j;
        dfs(step+1,res^(1<<j));
        num[d[step]]=-1;
        used[j]=vis[d[step]]=false;
    }
}
int main(){
    freopen("alpha.in","r",stdin);
    freopen("alpha.out","w",stdout);
    for(int i=0;i<=30;i++)
        mp[1<<i]=i;
    scanf("%d",&n);
    scanf("%s",a+1);
    scanf("%s",b+1);
    bool Y[50]={0};
    scanf("%s",c+1);
    for(int i=n,j=1;i;i--){
        a[i]-='A',b[i]-='A';
        c[i]-='A';
        if(!Y[a[i]])
            d[j++]=a[i],Y[a[i]]=true;
        if(!Y[b[i]])
            d[j++]=b[i],Y[b[i]]=true;
        if(!Y[c[i]])
            d[j++]=c[i],Y[c[i]]=true;
        num[i-1]=-1;
    }
    /*printing(a);
    printing(b);
    printing(c);
    */
    for(int i=0;i<n;i++){
        used[i]=vis[d[1]]=true;
        num[d[1]]=i;
        //printf("i=%d\n",i);
        dfs(2,((1<<n)-1)^(1<<i));
        num[d[1]]=-1;
        used[i]=vis[d[1]]=false;
    }
    printf("\n");
    for(int i=1;i<=n;i++)
        printf("%2d",d[i]);
}