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;
}