fp.cpp
#include <vector>
#include <list>
#include <map>
#include <set>
#include <algorithm>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#define vi vector <int>
#define vvi vector <vi>
#define vvvi vector <vvi>
#define vl vector <long long>
#define vpii vector <pair <int,int> >
#define mp(x,y) make_pair(x,y)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define FOR(i,n) for(ll i=0;i<int(n);i++)
#define READ(v,n) {FOR(i,n){ll x;cin>>x;v.pb(x);} }
#define gmin(a,b) {if (b<a) a=b;}
#define gmax(a,b) {if (b>a) a=b;}
#define pb push_back
#define ppb pop_back
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
vvi invert(vvi a){
vvi b=a;
FOR(i,5)
FOR(j,5){
b[i][j]=a[j][i];
}
return b;
}
vvi rotate(vvi a){
vvi b=a;
FOR(i,5)
FOR(j,5){
b[i][j]=a[4-j][i];
}
int c;
rep:
c=0;
FOR(i,5){
if(b[0][i]==1)c++;
}
if(c==0){
vvi c=b;
FOR(i,5)
FOR(j,5){
if(i==4){c[i][j]=0;}else{c[i][j]=b[i+1][j];}
}
b=c;
goto rep;
}
rep2:
c=0;
FOR(i,5){
if(b[i][0]==1)c++;
}
if(c==0){
vvi c=b;
FOR(i,5)
FOR(j,5){
if(j==4){c[i][j]=0;}else{c[i][j]=b[i][j+1];}
}
b=c;
goto rep2;
}
return b;
}
int main(){
vi v(5,0);
vvi w;
FOR(i,5)w.pb(v);
vvvi c;
FOR(i,256)c.pb(w);
c['F'][1][0]=1;
c['F'][2][0]=1;
c['F'][0][1]=1;
c['F'][1][1]=1;
c['F'][1][2]=1;
c['I'][0][0]=1;
c['I'][0][1]=1;
c['I'][0][2]=1;
c['I'][0][3]=1;
c['I'][0][4]=1;
c['L'][0][0]=1;
c['L'][0][1]=1;
c['L'][0][2]=1;
c['L'][0][3]=1;
c['L'][1][3]=1;
c['N'][1][0]=1;
c['N'][1][1]=1;
c['N'][0][2]=1;
c['N'][1][2]=1;
c['N'][0][3]=1;
c['P'][0][0]=1;
c['P'][1][0]=1;
c['P'][0][1]=1;
c['P'][1][1]=1;
c['P'][0][2]=1;
c['T'][0][0]=1;
c['T'][1][0]=1;
c['T'][2][0]=1;
c['T'][1][1]=1;
c['T'][1][2]=1;
c['U'][0][0]=1;
c['U'][2][0]=1;
c['U'][0][1]=1;
c['U'][1][1]=1;
c['U'][2][1]=1;
c['V'][0][0]=1;
c['V'][0][1]=1;
c['V'][0][2]=1;
c['V'][1][2]=1;
c['V'][2][2]=1;
c['W'][0][0]=1;
c['W'][0][1]=1;
c['W'][1][1]=1;
c['W'][1][2]=1;
c['W'][2][2]=1;
c['X'][1][0]=1;
c['X'][0][1]=1;
c['X'][1][1]=1;
c['X'][2][1]=1;
c['X'][1][2]=1;
c['Y'][1][0]=1;
c['Y'][0][1]=1;
c['Y'][1][1]=1;
c['Y'][1][2]=1;
c['Y'][1][3]=1;
c['Z'][0][0]=1;
c['Z'][1][0]=1;
c['Z'][1][1]=1;
c['Z'][1][2]=1;
c['Z'][2][2]=1;
char x,y;
while(cin>>x>>y){
string s="";
set <string> sset;
vvi aa=c[x];
vvi bb=c[y];
{
FOR(i,2)
FOR(r,4)
FOR(x,6)
FOR(y,4){
vvi a=aa;
vvi p(6,vi(4,0));
if(i==1){a=invert(a);}
FOR(j,r){a=rotate(a);}
FOR(k,5)
FOR(l,5){
if(a[k][l]==1 && (x+k>=6 || y+l>=4)){goto con;}
if(a[k][l]==1){
if(p[x+k][y+l]==1){goto con;}
p[x+k][y+l]+=a[k][l];
}
}
FOR(ii,2)
FOR(rr,4)
FOR(xx,6)
FOR(yy,4){
vvi b=bb;
vvi pp=p;
if(ii==1){b=invert(b);}
FOR(j,rr){b=rotate(b);}
FOR(k,5)
FOR(l,5){
if(b[k][l]==1 && (xx+k>=6 || yy+l>=4)){goto con2;}
if(b[k][l]==1){
if(pp[xx+k][yy+l]==1){goto con2;}
pp[xx+k][yy+l]+=b[k][l];
}
}
s="";
FOR(k,6)
FOR(l,4)
s=s+(char)(pp[k][l]+'0');
sset.insert(s);
con2:
continue;
}
con:
continue;
}
}
cin>>x>>y;
s="";
aa=c[x];
bb=c[y];
FOR(i,2)
FOR(r,4)
FOR(x,6)
FOR(y,4){
vvi a=aa;
vvi p(6,vi(4,0));
if(i==1){a=invert(a);}
FOR(j,r){a=rotate(a);}
FOR(k,5)
FOR(l,5){
if(a[k][l]==1 && (x+k>=6 || y+l>=4)){goto con3;}
if(a[k][l]==1){
if(p[x+k][y+l]==1){goto con3;}
p[x+k][y+l]+=a[k][l];
}
}
FOR(ii,2)
FOR(rr,4)
FOR(xx,6)
FOR(yy,4){
vvi b=bb;
vvi pp=p;
if(ii==1){b=invert(b);}
FOR(j,rr){b=rotate(b);}
FOR(k,5)
FOR(l,5){
if(b[k][l]==1 && (xx+k>=6 || yy+l>=4)){goto con23;}
if(b[k][l]==1){
if(pp[xx+k][yy+l]==1){goto con23;}
pp[xx+k][yy+l]+=b[k][l];
}
}
s="";
FOR(k,6)
FOR(l,4)
s=s+(char)(pp[k][l]+'0');
if(sset.find(s)!=sset.end()){cout<<"YES"<<endl;goto nextcase;}
con23:
continue;
}
con3:
continue;
}
cout<<"NO"<<endl;
nextcase:
continue;
}
return 0;
}