我的也不输出
```cpp
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lowbit(x) (x&(-x))
using namespace std;
int n, dist[26],sk; char logs[67108864];
char s[3][27];
void print()
{
for (int i = 0; i < n; i++)
{
cout << dist[i];
}
}
void css(int x, int y, int jw)
{
if (x == 0)
{
if (jw == 0)
{
print();//
}
return;
}
for (int i = x - 1; i >= 1; i--)
{
int w1 = dist[s[1][i]];
int w2 = dist[s[2][i]];
int w3 = dist[s[3][i]];
if (w1 == -1 || w2 == -1 || w3 == -1) continue;
//why
if ((w1 + w2) % n != w3 && (w1 + w2 + 1) % n != w3)return;
}
if(dist[s[y][x]]==-1)
{
int st = sk;
while (st != 0)
{
int nxt = lowbit(st);
int i = logs[nxt];
st = st & (~nxt);
if (y != 3)//赋值
{
dist[s[y][x]] = i;
sk = sk & (~nxt);
css(x, y + 1, jw);
dist[s[y][x]] = -1;
sk = sk | nxt;
}
else//判断赋值
{
int w1 = dist[s[1][x]] + dist[s[2][x]] + jw;
if (w1%n != i) continue;
dist[s[3][x]] = i; sk = sk & (~nxt);
css(x - 1, 1, w1 / n);
dist[s[3][x]] = -1; sk = sk | nxt;
}
}
}
else
if (y != 3)//赋值
css(x, y + 1, jw);
else//判断赋值
{
int w1 = dist[s[1][x]] + dist[s[2][x]] + jw;
if (w1%n != dist[s[3][x]]) return;
css(x - 1, 1, w1 / n);
}
}
int main()
{
cin >> n ;
for (int i = 1; i <= 3; i++)
{
scanf("%s", s[i]+1);
for(int j=1;j<=n;j++)
{
s[i][j] -= 'A';
}
}
for (int i = 1; i <= n; i++)
{
logs[1 << (i - 1)] = n - i + 1;
}
sk = (1 << n) - 1;
memset(dist, -1, sizeof(dist));
css(n,1,0);
return 0;
}
```
by a66666 @ 2018-06-03 21:58:45