fp.cpp
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<climits>
#include<algorithm>
#include<utility>
#include<string>
#include<deque>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
using namespace std;
#define REP(i,N) for (int i = 0; i < (N); i++)
#define FOR(i,a,b) for (int i = (a); i <= (b); i++)
#define FORI(i,a,b) for (int i = (a); i < (b); i++)
#define FORD(i,a,b) for (int i = (a)-1; i >= (b); i--)
#define DP(arg...) fprintf(stderr, ## arg)
typedef long long ll;
typedef long double ld;
typedef pair<int,int> ii;
char P[15][5][6] = {
{
{".XX.."},
{"XX..."},
{".X..."},
{"....."},
{"....."}
},
{
{"X...."},
{"X...."},
{"X...."},
{"X...."},
{"X...."}
},
{
{"X...."},
{"X...."},
{"X...."},
{"XX..."},
{"....."}
},
{
{".X..."},
{".X..."},
{"XX..."},
{"X...."},
{"....."}
},
{
{"XX..."},
{"XX..."},
{"X...."},
{"....."},
{"....."}
},
{
{"XXX.."},
{".X..."},
{".X..."},
{"....."},
{"....."}
},
{
{"X.X.."},
{"XXX.."},
{"....."},
{"....."},
{"....."}
},
{
{"X...."},
{"X...."},
{"XXX.."},
{"....."},
{"....."}
},
{
{"X...."},
{"XX..."},
{".XX.."},
{"....."},
{"....."}
},
{
{".X..."},
{"XXX.."},
{".X..."},
{"....."},
{"....."}
},
{
{".X..."},
{"XX..."},
{".X..."},
{".X..."},
{"....."}
},
{
{"XX..."},
{".X..."},
{".XX.."},
{"....."},
{"....."}
}
};
char A[4];
int a[4];
char poz[12][8][5][6];
int op[4][2] = {{1,1}, {1, -1}, {-1, 1}, {-1, -1}};
int res1[25][25];
int res2[25][25];
int table(char c) {
switch(c) {
case 'F': return 0;
case 'I': return 1;
case 'L': return 2;
case 'N': return 3;
case 'P': return 4;
case 'T': return 5;
case 'U': return 6;
case 'V': return 7;
case 'W': return 8;
case 'X': return 9;
case 'Y': return 10;
case 'Z': return 11;
}
}
void solve() {
REP(i, 4) a[i] = table(A[i]);
bool exist = 0;
REP(i, 8) REP(j, 8) REP(x1, 5) REP(y1, 5) {
REP(p, 10) REP(q, 10) res1[p][q] = 0;
REP(p, 5) REP(q, 5) {
char c = poz[a[0]][i][p][q];
res1[p][q] += (c=='X')?1:0;
c = poz[a[1]][j][p][q];
res1[p+x1][q+y1] += (c=='X')?1:0;
}
bool kolize = 0;
REP(p, 10) REP(q, 10) if (res1[p][q]>1) kolize = 1;
if (kolize) continue;
REP(k, 8) REP(l, 8) REP(x2, 5) REP(y2, 5) {
REP(p, 10) REP(q, 10) res2[p][q] = 0;
REP(p, 5) REP(q, 5) {
char c = poz[a[2]][k][p][q];
res2[p][q] += (c=='X')?1:0;
c = poz[a[3]][l][p][q];
res2[p+x2][q+y2] += (c=='X')?1:0;
}
bool kolize = 0;
REP(p, 10) REP(q, 10) if (res2[p][q]>1) kolize = 1;
if (kolize) continue;
bool stejne = 1;
int pp1, qq1, pp2, qq2;
REP(p, 10) REP(q, 10) {
if (res1[p][q]==1) {
pp1 = p; qq1 = q; goto pryc1;
}
}
pryc1:
REP(p, 10) REP(q, 10) {
if (res2[p][q]==1) {
pp2 = p; qq2 = q; goto pryc2;
}
}
pryc2:
REP(p, 10) REP(q, 10) if (res1[p+pp1][q+qq1]!=res2[p+pp2][q+qq2]) stejne = false;
if (stejne) {
exist = true;
goto ven;
}
}
}
ven:
if (exist) printf("YES\n");
else printf("NO\n");
}
int main() {
REP(i, 12) {
//REP(k, 4) {
REP(x, 5) REP(y, 5) {
poz[i][0][x][y] = P[i][x][y];
poz[i][1][x][y] = P[i][4-x][y];
poz[i][2][x][y] = P[i][x][4-y];
poz[i][3][x][y] = P[i][4-x][4-y];
poz[i][4][x][y] = P[i][y][x];
poz[i][5][x][y] = P[i][4-y][4-x];
poz[i][6][x][y] = P[i][y][4-x];
poz[i][7][x][y] = P[i][4-y][x];
}
//}
}
while (scanf(" %c %c %c %c", &A[0], &A[1], &A[2], &A[3]) != EOF) {
solve();
}
return 0;
}