求助大佬
查看原帖
求助大佬
101484
Ticzone楼主2020/7/26 11:14

RT
用了两个check函数(不是last_check),8RE 2TLE
不用能2AC 其他的全T..

#define F(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define lal long long int
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
char ch1[101],ch2[101],ch3[101];
lal ans[101];
lal book[101];
lal n;
lal count(char ch)
{
	return ch-'A'+1;
}
bool last_check()
{
	lal add1=0,add2=0,result=0;
	for(lal i=n;i>=1;i--)
	{
		add1+=ans[count(ch1[i])]*pow(n,n-i+1);
        add2+=ans[count(ch2[i])]*pow(n,n-i+1);
        result+=ans[count(ch3[i])]*pow(n,n-i+1);
	}
    if(add1+add2==result)
        return true;
    else
        return false;
}
bool check1()
{
    if(book[count(ch1[1])] && book[count(ch2[1])] && book[count(ch3[1])])
        if((ans[count(ch1[1])]+ans[count(ch2[1])])%n!=ans[count(ch3[1])] && (ans[count(ch1[1])]+ans[count(ch2[1])]+1)%n!=ans[count(ch3[1])])
            return false;
    return true;
}
bool check2(lal now)
{
    lal sum=0;
    if(book[count(ch1[now])]) sum++;
    if(book[count(ch2[now])]) sum++;
    if(book[count(ch3[now])]) sum++;
    if(sum!=2)
        return true;
    if((book[count(ch1[now])] && book[count(ch3[now])]) || (book[count(ch2[now])] &&book[count(ch3[now])]))
    {
        if(book[count(ch1[now])])
        {
            lal p1,p2;
            p1=(ans[count(ch3[now])]-ans[count(ch1[now])]+n)%n;
            p1=(ans[count(ch3[now])]-ans[count(ch1[now])]+n+1)%n;
            if(book[p1] && book[p2])
                return false;
        }
        else
        {
            lal p1,p2;
            p1=(ans[count(ch3[now])]-ans[count(ch2[now])]+n)%n;
            p1=(ans[count(ch3[now])]-ans[count(ch2[now])]+n+1)%n;
            if(book[p1] && book[p2])
                return false;
        }
    }
    return true;
}
void dfs(lal step)
{
    if(!check1() || !check2(step))
        return;
	if(step==n+1)
	{
		if(last_check())
		{
			for(lal i=1;i<=n;i++)
				printf("%lld ",ans[i]);
			exit(0);
		}
		else
			return;
	}
	for(lal i=0;i<n;i++)
	{
		if(!book[i])
		{
			book[i]=!book[i];
			ans[step]=i;
////            for (lal j=1;j<=n;j++)
////            	printf("%c --> %lld ",j+'A'-1,ans[j]);
//            printf("\n");
			dfs(step+1);
			ans[step]=-1;
			book[i]=!book[i];
		}
	}
}
int main()
{
//	F("");
	scanf("%lld%s%s%s",&n,ch1+1,ch2+1,ch3+1);
    for (lal i=1;i<=n;i++)
        ans[i]=-1;
	dfs(1);
	return 0;
}
2020/7/26 11:14
加载中...