Go to diff to previous submission
#include <bits/stdc++.h> using namespace std; int main() { string pent[][5] ={ {"01100","11000","01000","00000","00000"}, {"10000","10000","10000","10000","10000"}, {"10000","10000","10000","11000","00000"}, {"01000","01000","11000","10000","00000"}, {"11000","11000","10000","00000","00000"}, {"11100","01000","01000","00000","00000"}, {"10100","11100","00000","00000","00000"}, {"10000","10000","11100","00000","00000"}, {"10000","11000","01100","00000","00000"}, {"01000","11100","01000","00000","00000"}, {"01000","11000","01000","01000","00000"}, {"11000","01000","01100","00000","00000"}}; string pentN ="FILNPTUVWXYZ"; string s,t; while(cin >> s >> t) { long long p =999983, mod =1000000007; int p1, p2, p3, p4; for(int i =0; i < pentN.length(); i++) if(s[0] == pentN[i]) p1 =i; for(int i =0; i < pentN.length(); i++) if(s[1] == pentN[i]) p2 =i; for(int i =0; i < pentN.length(); i++) if(t[0] == pentN[i]) p3 =i; for(int i =0; i < pentN.length(); i++) if(t[1] == pentN[i]) p4 =i; set<long long> S; int dx[] ={1,-1,0,0}; int dy[] ={0,0,1,-1}; int M[15][15]; for(int i =0; i < 225; i++) M[i/15][i%15] =0; for(int rot =0; rot < 64; rot++) { vector< pair<int,int> > surA; for(int i =0; i < 25; i++) if(pent[p1][i/5][i%5] == '1') { if(rot/8 == 0) surA.push_back(make_pair(i/5,i%5)); if(rot/8 == 1) surA.push_back(make_pair(i/5,4-i%5)); if(rot/8 == 2) surA.push_back(make_pair(4-i/5,i%5)); if(rot/8 == 3) surA.push_back(make_pair(4-i/5,4-i%5)); if(rot/8 == 4) surA.push_back(make_pair(i%5,i/5)); if(rot/8 == 5) surA.push_back(make_pair(i%5,4-i/5)); if(rot/8 == 6) surA.push_back(make_pair(4-i%5,i/5)); if(rot/8 == 7) surA.push_back(make_pair(4-i%5,4-i/5));} vector< pair<int,int> > surB; for(int i =0; i < 25; i++) if(pent[p2][i/5][i%5] == '1') { if(rot%8 == 0) surB.push_back(make_pair(i/5,i%5)); if(rot%8 == 1) surB.push_back(make_pair(i/5,4-i%5)); if(rot%8 == 2) surB.push_back(make_pair(4-i/5,i%5)); if(rot%8 == 3) surB.push_back(make_pair(4-i/5,4-i%5)); if(rot%8 == 4) surB.push_back(make_pair(i%5,i/5)); if(rot%8 == 5) surB.push_back(make_pair(i%5,4-i/5)); if(rot%8 == 6) surB.push_back(make_pair(4-i%5,i/5)); if(rot%8 == 7) surB.push_back(make_pair(4-i%5,4-i/5));} for(int i =0; i < 5; i++) for(int j =0; j < 4; j++) for(int k =0; k < 5; k++) { int x =surA[i].first+dx[j]-surB[k].first, y =surA[i].second+dy[j]-surB[k].second; bool ok =true; for(int l =0; l < 5; l++) M[5+surA[l].first][5+surA[l].second]++; for(int l =0; l < 5; l++) { M[5+surB[l].first+x][5+surB[l].second+y]++; if(M[5+surB[l].first+x][5+surB[l].second+y] > 1) {ok =false; break;}} if(ok) { // hashuj int minX =15, minY =15; for(int l =0; l < 225; l++) if(M[l/15][l%15] == 1) { minX =min(minX,l/15); minY =min(minY,l%15);} long long H =0; for(int l =0; l < 225; l++) { H =(p*H+1+((l/15+minX >= 15 || l%15+minY >= 15)?0:M[l/15+minX][l%15+minY]))%mod; if(H < 0) H +=mod;} S.insert(H);} for(int l =0; l < 5; l++) M[5+surA[l].first][5+surA[l].second] =0; for(int l =0; l < 5; l++) M[5+surB[l].first+x][5+surB[l].second+y] =0; } } bool xyz =false; for(int rot =0; rot < 8; rot++) { vector< pair<int,int> > surA; for(int i =0; i < 25; i++) if(pent[p3][i/5][i%5] == '1') surA.push_back(make_pair(i/5,i%5)); vector< pair<int,int> > surB; for(int i =0; i < 25; i++) if(pent[p4][i/5][i%5] == '1') { if(rot == 0) surB.push_back(make_pair(i/5,i%5)); if(rot == 1) surB.push_back(make_pair(i/5,4-i%5)); if(rot == 2) surB.push_back(make_pair(4-i/5,i%5)); if(rot == 3) surB.push_back(make_pair(4-i/5,4-i%5)); if(rot == 4) surB.push_back(make_pair(i%5,i/5)); if(rot == 5) surB.push_back(make_pair(i%5,4-i/5)); if(rot == 6) surB.push_back(make_pair(4-i%5,i/5)); if(rot == 7) surB.push_back(make_pair(4-i%5,4-i/5));} 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++) { int x =surA[i].first+dx[j]-surB[k].first, y =surA[i].second+dy[j]-surB[k].second; bool ok =true; for(int l =0; l < 5; l++) M[5+surA[l].first][5+surA[l].second]++; for(int l =0; l < 5; l++) { M[5+surB[l].first+x][5+surB[l].second+y]++; if(M[5+surB[l].first+x][5+surB[l].second+y] > 1) {ok =false; break;}} if(ok) { // hashuj int minX =15, minY =15; for(int l =0; l < 225; l++) if(M[l/15][l%15] == 1) { minX =min(minX,l/15); minY =min(minY,l%15);} long long H =0; for(int l =0; l < 225; l++) { H =(p*H+1+((l/15+minX >= 15 || l%15+minY >= 15)?0:M[l/15+minX][l%15+minY]))%mod; if(H < 0) H +=mod;} if(S.find(H) != S.end()) xyz =true;} if(xyz) break; for(int l =0; l < 5; l++) M[5+surA[l].first][5+surA[l].second] =0; for(int l =0; l < 5; l++) M[5+surB[l].first+x][5+surB[l].second+y] =0; } if(xyz) break;} if(xyz) cout << "YES\n"; else cout << "NO\n";} return 0;}
--- c5.s887.cteam002.fp.cpp.0.fp.cpp +++ c5.s901.cteam002.fp.cpp.0.fp.cpp @@ -31,25 +31,25 @@ int M[15][15]; for(int i =0; i < 225; i++) M[i/15][i%15] =0; - for(int rot =0; rot < 16; rot++) { + for(int rot =0; rot < 64; rot++) { vector< pair<int,int> > surA; for(int i =0; i < 25; i++) if(pent[p1][i/5][i%5] == '1') { - if(rot/4 == 0) surA.push_back(make_pair(i/5,i%5)); - if(rot/4 == 1) surA.push_back(make_pair(i/5,4-i%5)); - if(rot/4 == 2) surA.push_back(make_pair(4-i/5,i%5)); - if(rot/4 == 3) surA.push_back(make_pair(4-i/5,4-i%5)); - if(rot/4 == 4) surA.push_back(make_pair(i%5,i/5)); - if(rot/4 == 5) surA.push_back(make_pair(i%5,4-i/5)); - if(rot/4 == 6) surA.push_back(make_pair(4-i%5,i/5)); - if(rot/4 == 7) surA.push_back(make_pair(4-i%5,4-i/5));} + if(rot/8 == 0) surA.push_back(make_pair(i/5,i%5)); + if(rot/8 == 1) surA.push_back(make_pair(i/5,4-i%5)); + if(rot/8 == 2) surA.push_back(make_pair(4-i/5,i%5)); + if(rot/8 == 3) surA.push_back(make_pair(4-i/5,4-i%5)); + if(rot/8 == 4) surA.push_back(make_pair(i%5,i/5)); + if(rot/8 == 5) surA.push_back(make_pair(i%5,4-i/5)); + if(rot/8 == 6) surA.push_back(make_pair(4-i%5,i/5)); + if(rot/8 == 7) surA.push_back(make_pair(4-i%5,4-i/5));} vector< pair<int,int> > surB; for(int i =0; i < 25; i++) if(pent[p2][i/5][i%5] == '1') { - if(rot%4 == 0) surB.push_back(make_pair(i/5,i%5)); - if(rot%4 == 1) surB.push_back(make_pair(i/5,4-i%5)); - if(rot%4 == 2) surB.push_back(make_pair(4-i/5,i%5)); - if(rot%4 == 3) surB.push_back(make_pair(4-i/5,4-i%5)); - if(rot%4 == 4) surB.push_back(make_pair(i%5,i/5)); - if(rot%4 == 5) surB.push_back(make_pair(i%5,4-i/5)); - if(rot%4 == 6) surB.push_back(make_pair(4-i%5,i/5)); - if(rot%4 == 7) surB.push_back(make_pair(4-i%5,4-i/5));} + if(rot%8 == 0) surB.push_back(make_pair(i/5,i%5)); + if(rot%8 == 1) surB.push_back(make_pair(i/5,4-i%5)); + if(rot%8 == 2) surB.push_back(make_pair(4-i/5,i%5)); + if(rot%8 == 3) surB.push_back(make_pair(4-i/5,4-i%5)); + if(rot%8 == 4) surB.push_back(make_pair(i%5,i/5)); + if(rot%8 == 5) surB.push_back(make_pair(i%5,4-i/5)); + if(rot%8 == 6) surB.push_back(make_pair(4-i%5,i/5)); + if(rot%8 == 7) surB.push_back(make_pair(4-i%5,4-i/5));} for(int i =0; i < 5; i++) for(int j =0; j < 4; j++) for(int k =0; k < 5; k++) {