Source code for submission s1105

fp.cpp

  1. #include <vector>
  2. #include <list>
  3. #include <map>
  4. #include <set>
  5. #include <algorithm>
  6. #include <numeric>
  7. #include <utility>
  8. #include <sstream>
  9. #include <iostream>
  10. #include <iomanip>
  11. #include <cstdio>
  12. #include <cmath>
  13. #include <cstdlib>
  14. #include <string>
  15.  
  16. #define vi vector <int>
  17. #define vvi vector <vi>
  18. #define vvvi vector <vvi>
  19. #define vl vector <long long>
  20. #define vpii vector <pair <int,int> >
  21. #define mp(x,y) make_pair(x,y)
  22. #define all(x) (x).begin(),(x).end()
  23. #define sz(x) (int)(x).size()
  24. #define FOR(i,n) for(ll i=0;i<int(n);i++)
  25. #define READ(v,n) {FOR(i,n){ll x;cin>>x;v.pb(x);} }
  26. #define gmin(a,b) {if (b<a) a=b;}
  27. #define gmax(a,b) {if (b>a) a=b;}
  28. #define pb push_back
  29. #define ppb pop_back
  30. typedef long long ll;
  31. typedef unsigned long long ull;
  32. using namespace std;
  33.  
  34. vvi invert(vvi a){
  35. vvi b=a;
  36. FOR(i,5)
  37. FOR(j,5){
  38. b[i][j]=a[j][i];
  39. }
  40. return b;
  41. }
  42.  
  43. vvi rotate(vvi a){
  44. vvi b=a;
  45. FOR(i,5)
  46. FOR(j,5){
  47. b[i][j]=a[4-j][i];
  48. }
  49. int c;
  50. rep:
  51. c=0;
  52. FOR(i,5){
  53. if(b[0][i]==1)c++;
  54. }
  55. if(c==0){
  56. vvi c=b;
  57. FOR(i,5)
  58. FOR(j,5){
  59. if(i==4){c[i][j]=0;}else{c[i][j]=b[i+1][j];}
  60. }
  61. b=c;
  62. goto rep;
  63. }
  64.  
  65. rep2:
  66. c=0;
  67. FOR(i,5){
  68. if(b[i][0]==1)c++;
  69. }
  70. if(c==0){
  71. vvi c=b;
  72. FOR(i,5)
  73. FOR(j,5){
  74. if(j==4){c[i][j]=0;}else{c[i][j]=b[i][j+1];}
  75. }
  76. b=c;
  77. goto rep2;
  78. }
  79. return b;
  80. }
  81.  
  82.  
  83.  
  84. int main(){
  85. vi v(5,0);
  86. vvi w;
  87. FOR(i,5)w.pb(v);
  88. vvvi c;
  89. FOR(i,256)c.pb(w);
  90. c['F'][1][0]=1;
  91. c['F'][2][0]=1;
  92. c['F'][0][1]=1;
  93. c['F'][1][1]=1;
  94. c['F'][1][2]=1;
  95.  
  96. c['I'][0][0]=1;
  97. c['I'][0][1]=1;
  98. c['I'][0][2]=1;
  99. c['I'][0][3]=1;
  100. c['I'][0][4]=1;
  101.  
  102. c['L'][0][0]=1;
  103. c['L'][0][1]=1;
  104. c['L'][0][2]=1;
  105. c['L'][0][3]=1;
  106. c['L'][1][3]=1;
  107.  
  108. c['N'][1][0]=1;
  109. c['N'][1][1]=1;
  110. c['N'][0][2]=1;
  111. c['N'][1][2]=1;
  112. c['N'][0][3]=1;
  113.  
  114. c['P'][0][0]=1;
  115. c['P'][1][0]=1;
  116. c['P'][0][1]=1;
  117. c['P'][1][1]=1;
  118. c['P'][0][2]=1;
  119.  
  120. c['T'][0][0]=1;
  121. c['T'][1][0]=1;
  122. c['T'][2][0]=1;
  123. c['T'][1][1]=1;
  124. c['T'][1][2]=1;
  125.  
  126. c['U'][0][0]=1;
  127. c['U'][2][0]=1;
  128. c['U'][0][1]=1;
  129. c['U'][1][1]=1;
  130. c['U'][2][1]=1;
  131.  
  132. c['V'][0][0]=1;
  133. c['V'][0][1]=1;
  134. c['V'][0][2]=1;
  135. c['V'][1][2]=1;
  136. c['V'][2][2]=1;
  137.  
  138. c['W'][0][0]=1;
  139. c['W'][0][1]=1;
  140. c['W'][1][1]=1;
  141. c['W'][1][2]=1;
  142. c['W'][2][2]=1;
  143.  
  144. c['X'][1][0]=1;
  145. c['X'][0][1]=1;
  146. c['X'][1][1]=1;
  147. c['X'][2][1]=1;
  148. c['X'][1][2]=1;
  149.  
  150. c['Y'][1][0]=1;
  151. c['Y'][0][1]=1;
  152. c['Y'][1][1]=1;
  153. c['Y'][1][2]=1;
  154. c['Y'][1][3]=1;
  155.  
  156. c['Z'][0][0]=1;
  157. c['Z'][1][0]=1;
  158. c['Z'][1][1]=1;
  159. c['Z'][1][2]=1;
  160. c['Z'][2][2]=1;
  161.  
  162.  
  163. char x,y;
  164. while(cin>>x>>y){
  165.  
  166. string s="";
  167. set <string> sset;
  168. vvi aa=c[x];
  169. vvi bb=c[y];
  170.  
  171. {
  172. FOR(i,2)
  173. FOR(r,4)
  174. FOR(x,6)
  175. FOR(y,4){
  176. vvi a=aa;
  177. vvi p(6,vi(4,0));
  178. if(i==1){a=invert(a);}
  179. FOR(j,r){a=rotate(a);}
  180. FOR(k,5)
  181. FOR(l,5){
  182. if(a[k][l]==1 && (x+k>=6 || y+l>=4)){goto con;}
  183. if(a[k][l]==1){
  184. if(p[x+k][y+l]==1){goto con;}
  185. p[x+k][y+l]+=a[k][l];
  186. }
  187. }
  188.  
  189. FOR(ii,2)
  190. FOR(rr,4)
  191. FOR(xx,6)
  192. FOR(yy,4){
  193. vvi b=bb;
  194. vvi pp=p;
  195. if(ii==1){b=invert(b);}
  196. FOR(j,rr){b=rotate(b);}
  197. FOR(k,5)
  198. FOR(l,5){
  199. if(b[k][l]==1 && (xx+k>=6 || yy+l>=4)){goto con2;}
  200. if(b[k][l]==1){
  201. if(pp[xx+k][yy+l]==1){goto con2;}
  202. pp[xx+k][yy+l]+=b[k][l];
  203. }
  204. }
  205.  
  206. s="";
  207. FOR(k,6)
  208. FOR(l,4)
  209. s=s+(char)(pp[k][l]+'0');
  210.  
  211.  
  212. sset.insert(s);
  213. con2:
  214. continue;
  215. }
  216. con:
  217. continue;
  218. }
  219.  
  220. }
  221.  
  222. cin>>x>>y;
  223. s="";
  224. aa=c[x];
  225. bb=c[y];
  226.  
  227. FOR(i,2)
  228. FOR(r,4)
  229. FOR(x,6)
  230. FOR(y,4){
  231. vvi a=aa;
  232. vvi p(6,vi(4,0));
  233. if(i==1){a=invert(a);}
  234. FOR(j,r){a=rotate(a);}
  235. FOR(k,5)
  236. FOR(l,5){
  237. if(a[k][l]==1 && (x+k>=6 || y+l>=4)){goto con3;}
  238. if(a[k][l]==1){
  239. if(p[x+k][y+l]==1){goto con3;}
  240. p[x+k][y+l]+=a[k][l];
  241. }
  242. }
  243.  
  244. FOR(ii,2)
  245. FOR(rr,4)
  246. FOR(xx,6)
  247. FOR(yy,4){
  248. vvi b=bb;
  249. vvi pp=p;
  250. if(ii==1){b=invert(b);}
  251. FOR(j,rr){b=rotate(b);}
  252. FOR(k,5)
  253. FOR(l,5){
  254. if(b[k][l]==1 && (xx+k>=6 || yy+l>=4)){goto con23;}
  255. if(b[k][l]==1){
  256. if(pp[xx+k][yy+l]==1){goto con23;}
  257. pp[xx+k][yy+l]+=b[k][l];
  258. }
  259. }
  260.  
  261. s="";
  262. FOR(k,6)
  263. FOR(l,4)
  264. s=s+(char)(pp[k][l]+'0');
  265.  
  266. if(sset.find(s)!=sset.end()){cout<<"YES"<<endl;goto nextcase;}
  267. con23:
  268. continue;
  269. }
  270. con3:
  271. continue;
  272. }
  273.  
  274. cout<<"NO"<<endl;
  275. nextcase:
  276. continue;
  277.  
  278. }
  279.  
  280.  
  281.  
  282. return 0;
  283. }
  284.  
  285.  
  286.