Source code for submission s887

fp.cpp

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main() {
  5. string pent[][5] ={
  6. {"01100","11000","01000","00000","00000"},
  7. {"10000","10000","10000","10000","10000"},
  8. {"10000","10000","10000","11000","00000"},
  9. {"01000","01000","11000","10000","00000"},
  10. {"11000","11000","10000","00000","00000"},
  11. {"11100","01000","01000","00000","00000"},
  12. {"10100","11100","00000","00000","00000"},
  13. {"10000","10000","11100","00000","00000"},
  14. {"10000","11000","01100","00000","00000"},
  15. {"01000","11100","01000","00000","00000"},
  16. {"01000","11000","01000","01000","00000"},
  17. {"11000","01000","01100","00000","00000"}};
  18. string pentN ="FILNPTUVWXYZ";
  19. string s,t;
  20. while(cin >> s >> t) {
  21. long long p =999983, mod =1000000007;
  22. int p1, p2, p3, p4;
  23. for(int i =0; i < pentN.length(); i++) if(s[0] == pentN[i]) p1 =i;
  24. for(int i =0; i < pentN.length(); i++) if(s[1] == pentN[i]) p2 =i;
  25. for(int i =0; i < pentN.length(); i++) if(t[0] == pentN[i]) p3 =i;
  26. for(int i =0; i < pentN.length(); i++) if(t[1] == pentN[i]) p4 =i;
  27.  
  28. set<long long> S;
  29. int dx[] ={1,-1,0,0};
  30. int dy[] ={0,0,1,-1};
  31. int M[15][15];
  32. for(int i =0; i < 225; i++) M[i/15][i%15] =0;
  33. for(int rot =0; rot < 16; rot++) {
  34. vector< pair<int,int> > surA;
  35. for(int i =0; i < 25; i++) if(pent[p1][i/5][i%5] == '1') {
  36. if(rot/4 == 0) surA.push_back(make_pair(i/5,i%5));
  37. if(rot/4 == 1) surA.push_back(make_pair(i/5,4-i%5));
  38. if(rot/4 == 2) surA.push_back(make_pair(4-i/5,i%5));
  39. if(rot/4 == 3) surA.push_back(make_pair(4-i/5,4-i%5));
  40. if(rot/4 == 4) surA.push_back(make_pair(i%5,i/5));
  41. if(rot/4 == 5) surA.push_back(make_pair(i%5,4-i/5));
  42. if(rot/4 == 6) surA.push_back(make_pair(4-i%5,i/5));
  43. if(rot/4 == 7) surA.push_back(make_pair(4-i%5,4-i/5));}
  44. vector< pair<int,int> > surB;
  45. for(int i =0; i < 25; i++) if(pent[p2][i/5][i%5] == '1') {
  46. if(rot%4 == 0) surB.push_back(make_pair(i/5,i%5));
  47. if(rot%4 == 1) surB.push_back(make_pair(i/5,4-i%5));
  48. if(rot%4 == 2) surB.push_back(make_pair(4-i/5,i%5));
  49. if(rot%4 == 3) surB.push_back(make_pair(4-i/5,4-i%5));
  50. if(rot%4 == 4) surB.push_back(make_pair(i%5,i/5));
  51. if(rot%4 == 5) surB.push_back(make_pair(i%5,4-i/5));
  52. if(rot%4 == 6) surB.push_back(make_pair(4-i%5,i/5));
  53. if(rot%4 == 7) surB.push_back(make_pair(4-i%5,4-i/5));}
  54.  
  55. for(int i =0; i < 5; i++) for(int j =0; j < 4; j++) for(int k =0; k < 5; k++) {
  56. int x =surA[i].first+dx[j]-surB[k].first, y =surA[i].second+dy[j]-surB[k].second;
  57. bool ok =true;
  58. for(int l =0; l < 5; l++) M[5+surA[l].first][5+surA[l].second]++;
  59. for(int l =0; l < 5; l++) {
  60. M[5+surB[l].first+x][5+surB[l].second+y]++;
  61. if(M[5+surB[l].first+x][5+surB[l].second+y] > 1) {ok =false; break;}}
  62. if(ok) {
  63. // hashuj
  64. int minX =15, minY =15;
  65. for(int l =0; l < 225; l++) if(M[l/15][l%15] == 1) {
  66. minX =min(minX,l/15);
  67. minY =min(minY,l%15);}
  68. long long H =0;
  69. for(int l =0; l < 225; l++) {
  70. H =(p*H+1+((l/15+minX >= 15 || l%15+minY >= 15)?0:M[l/15+minX][l%15+minY]))%mod;
  71. if(H < 0) H +=mod;}
  72. S.insert(H);}
  73. for(int l =0; l < 5; l++) M[5+surA[l].first][5+surA[l].second] =0;
  74. for(int l =0; l < 5; l++) M[5+surB[l].first+x][5+surB[l].second+y] =0;
  75. }
  76. }
  77.  
  78. bool xyz =false;
  79. for(int rot =0; rot < 8; rot++) {
  80. vector< pair<int,int> > surA;
  81. for(int i =0; i < 25; i++) if(pent[p3][i/5][i%5] == '1')
  82. surA.push_back(make_pair(i/5,i%5));
  83. vector< pair<int,int> > surB;
  84. for(int i =0; i < 25; i++) if(pent[p4][i/5][i%5] == '1') {
  85. if(rot == 0) surB.push_back(make_pair(i/5,i%5));
  86. if(rot == 1) surB.push_back(make_pair(i/5,4-i%5));
  87. if(rot == 2) surB.push_back(make_pair(4-i/5,i%5));
  88. if(rot == 3) surB.push_back(make_pair(4-i/5,4-i%5));
  89. if(rot == 4) surB.push_back(make_pair(i%5,i/5));
  90. if(rot == 5) surB.push_back(make_pair(i%5,4-i/5));
  91. if(rot == 6) surB.push_back(make_pair(4-i%5,i/5));
  92. if(rot == 7) surB.push_back(make_pair(4-i%5,4-i/5));}
  93.  
  94. for(int i =0; i < 5; i++) if(!xyz) for(int j =0; j < 4; j++) if(!xyz) for(int k =0; k < 5; k++) {
  95. int x =surA[i].first+dx[j]-surB[k].first, y =surA[i].second+dy[j]-surB[k].second;
  96. bool ok =true;
  97. for(int l =0; l < 5; l++) M[5+surA[l].first][5+surA[l].second]++;
  98. for(int l =0; l < 5; l++) {
  99. M[5+surB[l].first+x][5+surB[l].second+y]++;
  100. if(M[5+surB[l].first+x][5+surB[l].second+y] > 1) {ok =false; break;}}
  101. if(ok) {
  102. // hashuj
  103. int minX =15, minY =15;
  104. for(int l =0; l < 225; l++) if(M[l/15][l%15] == 1) {
  105. minX =min(minX,l/15);
  106. minY =min(minY,l%15);}
  107. long long H =0;
  108. for(int l =0; l < 225; l++) {
  109. H =(p*H+1+((l/15+minX >= 15 || l%15+minY >= 15)?0:M[l/15+minX][l%15+minY]))%mod;
  110. if(H < 0) H +=mod;}
  111. if(S.find(H) != S.end()) xyz =true;}
  112. if(xyz) break;
  113. for(int l =0; l < 5; l++) M[5+surA[l].first][5+surA[l].second] =0;
  114. for(int l =0; l < 5; l++) M[5+surB[l].first+x][5+surB[l].second+y] =0;
  115. }
  116. if(xyz) break;}
  117. if(xyz) cout << "YES\n";
  118. else cout << "NO\n";}
  119. return 0;}
  120.