#9TLE 实在调不过去
查看原帖
#9TLE 实在调不过去
808950
iqwl楼主2023/9/7 15:57
#include<bits/stdc++.h>
#define get(a) a-'A'
using namespace std;

const int N=27;

char a[N],b[N],c[N];
int A[N],B[N],C[N];
bool use[N];
int s[N],k;
int n,vis[N],ans[N];

void make(char c)
{
    int p=get(c);
    if(!use[p])
    {
        use[p]=1;
        s[k++]=p;
    }
    return ;
}

bool check1()
{
    for(int i=n-1;i>=0;--i)
    {
        int x=ans[A[i]],y=ans[B[i]],z=ans[C[i]];
        if(x==-1||y==-1||z==-1)continue;
        if((x+y)%n!=z&&(x+y+1)%n!=z)return true;
    }
    return false;
}

bool check2()
{
    int x=0;
    for(int i=n-1;i>=0;--i)
    {
        int w=ans[A[i]]+ans[B[i]]+x;
        if(w%n!=ans[C[i]])return false;
        x=w/n;
    }
    if(x>0)return false;
    return true;
}

void dfs(int now)
{
    if(check1())
    {
        //cout<<"*"<<endl;
        return;
    }
    if(now==n)
    {
        if(check2())
        {
            for(int i=0;i<n;++i)printf("%d ",ans[i]);
            exit(0);
        }
        return;
    }

    for(int i=0;i<n;++i)
    {
        if(!vis[i])
        {
            vis[i]=1;
            ans[s[now]]=i;
            dfs(now+1);
            vis[i]=0;
            ans[s[now]]=-1;
        }
    }
    return;
}

int main()
{
	scanf("%d%s%s%s",&n,a,b,c);
    for(int i=0;i<n;++i)
    {
        make(a[i]);
        make(b[i]);
        make(c[i]);
    }
    memset(ans,-1,sizeof ans);
    for(int i=0;i<n;i++)
    {
    	A[i]=get(a[i]);
    	B[i]=get(b[i]);
    	C[i]=get(c[i]);
    }

    dfs(0);

    return 0;
}
2023/9/7 15:57
加载中...