Problem:
Problem J: Hanimon
ハニカムモンスターはハニカム模様の六角形状の不思議な生き物である。
ハニカムモンスターには様々なサイズのものがあり、一辺が
N
個の正六角形のマスから成るハニカムモンスターをサイズ
N
のハニカムモンスターとする。
一方、聖なる模様はハニカムモンスターと同じく、六角形として定義され1辺が
P
個の正六角形のマスから成る聖なる模様をサイズ
P
の聖なる模様とする。
ハニカムモンスターと聖なる模様の形の例を以下に示す。サイズは1辺の正六角形のマスの数に対応する。
図1:
サイズの例
図2:
ハニカムモンスターと聖なる模様の例 (Sample Input 1)
ハニカムモンスターと聖なる模様の各マスには色が着いており0と1によって表される。
サイズ
P
の
Q
個の聖なる模様のすべてを含むハニカムモンスターは伝説のハニモンと呼ばれている。
サイズ
N
のハニカムモンスターとその模様、
Q
個のサイズ
P
の聖なる模様が与えられるので、
そのハニカムモンスターが伝説のハニモンであるかどうかを判定するプログラムを作成せよ。
Input
入力は次の形式で表される。
N
P
Q
(空行)
ハニカムモンスターの模様の情報
(空行)
1つ目の聖なる模様の情報
(空行)
2つ目の聖なる模様の情報
(空行)
...
Q
つ目の聖なる模様の情報
N
,
P
,
Q
はそれぞれハニカムモンスターのサイズ,聖なる模様のサイズ,聖なる模様の個数を表す。
サイズ
N
のハニカムモンスターの模様の情報は以下の様に2×
N
-1行で与えられる。
N
個のマス
N
+1個のマス
N
+2個のマス
.
.
2×
N
-2個のマス
2×
N
-1個のマス
2×
N
-2個のマス
.
.
N
+2個のマス
N
+1個のマス
N
個のマス
サイズ
P
の聖なる模様の情報は以下の様に2×
P
-1行で与えられる。
P
個のマス
P
+1個のマス
P
+2個のマス
.
.
2×
P
-2個のマス
2×
P
-1個のマス
2×
P
-2個のマス
.
.
P
+2個のマス
P
+1個のマス
P
個のマス
それぞれのマスの間には１つの空白が入り、マスには０か1が入る。
Constraints
1 ≤
N
≤ 1000
1 ≤
P
≤ 50
1 ≤
Q
≤ 100
同じ模様の聖なる模様が複数個与えられることは無い。
ハニカムモンスターのあるマスについて、2つ以上の聖なる模様の一部分であることがある。
ハニカムモンスターと聖なる模様は回転できない。
Output
伝説のハニモンなら YES を、そうでなければ NO を一行に出力せよ。
Sample Input 1
6 2 2

1 1 1 1 1 1
1 0 0 0 0 1 0
1 0 1 0 0 1 0 1
1 1 1 1 1 1 1 0 0
0 0 1 0 0 0 1 0 1 1
1 1 1 0 1 0 0 1 1 0 1
0 1 0 1 0 0 1 1 1 0
0 1 1 1 1 0 0 1 1
0 0 0 0 1 0 1 0
1 1 1 0 1 1 0
0 1 1 0 0 1

0 1
1 1 1
1 0

0 0
0 1 0
1 1
Sample Output 1
YES
Sample Input 2
6 2 2

0 0 0 1 0 0
1 0 1 1 0 0 1
1 0 1 0 0 1 1 0
0 1 0 1 0 0 0 0 0
0 0 1 1 1 1 0 0 1 1
0 0 0 1 0 0 1 1 0 0 0
0 0 1 0 0 1 1 0 1 1
1 0 0 1 1 1 1 1 1
0 1 0 0 1 0 0 0
0 0 1 0 1 0 0
0 1 1 0 1 0

1 0
1 0 0
1 1

0 1
0 0 1
0 1
Sample Output 2
NO

Submitted solutions:

code_snippet: #include<bits/stdc++.h>

#define rep(i,n) for(int i=0;i<(int)n;i++)
#define all(c) (c).begin(),(c).end()
#define mp make_pair
#define pb push_back
#define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
#define dbg(x) cerr<<__LINE__<<": "<<#x<<" = "<<(x)<<endl

using namespace std;

typedef unsigned long long ll;
typedef vector<int> vi;
typedef pair<int,int> pi;
const int inf = (int)1e9;
const double INF = 1e12, EPS = 1e-9;

int N, p, q;
ll A[2000][2000], B[2000][2000];
int la[2000], ra[2000];
int lb[2000], rb[2000];

void input(int n, ll a[2000][2000], int *l, int *r){
	
	rep(i, 2000) rep(j, 2000) a[i][j] = 0;
	
	rep(i, 2 * n - 1){
		int len = i < n ? n + i : 3 * n - i - 2;
		int ofs = i < n ? 0 : i - n + 1;
		
		l[i] = ofs;
		r[i] = ofs + len;
		
		rep(j, len){
			int t; scanf("%d", &t);
			
			if(t) rep(k, 60){
				if(ofs + j - k < 0) break;
				a[i][ofs + j - k] |= 1ull << k;
			}
		}
	}
	//rep(i, 2 * n - 1) rep(j, 2 * n - 1) cerr<<(a[i][j]&1)<<(j==2*n-2?"\n":" ");
}

int main(){
	
	scanf("%d%d%d", &N, &p, &q);
	
	input(N, A, la, ra);
	while(q--){
		input(p, B, lb, rb);
		
		bool found = 0;
		
		rep(i, 2 * N - 1) for(int j = la[i]; j < ra[i]; j++){
			
			bool ok = 1;
			
			rep(k, 2 * p - 1){
				
				int len = rb[k] - lb[k];
				int pos = 0;
				
				if(ra[i + k] - j < len){
					ok = 0;
					break;
				}
				
				rep(it, 2){
					
					int clen = min(60, len);
					
					ll x = A[i + k][j + lb[k] + pos] & (1ull << clen) - 1ull;
					ll y = B[k][lb[k] + pos] & (1ull << clen) - 1ull;
					
					/*
					if(i == 2 && j == 1){
						dbg(it); dbg(x); dbg(y);
					}
					*/
					if(x != y){
						ok = 0;
						break;
					}
					
					len -= clen;
					pos += clen;
					if(len <= 0) break;
				}
				if(!ok) break;
			}
			if(ok){
				//cerr<<"i: "<<i<<" j: "<<j<<endl;
				found = 1;
				goto END;
			}
		}
		END:
		if(!found){
			cout << "NO" << endl;
			return 0;
		}
	}
	cout << "YES" << endl;
	
	return 0;
}
accuracy: 1
time_ms: 1070
memory_kb: 63728
final_rank: 1

code_snippet: #include<bits/stdc++.h>

#define rep(i,n) for(int i=0;i<(int)n;i++)
#define all(c) (c).begin(),(c).end()
#define mp make_pair
#define pb push_back
#define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
#define dbg(x) cerr<<__LINE__<<": "<<#x<<" = "<<(x)<<endl

using namespace std;

typedef unsigned long long ll;
typedef vector<int> vi;
typedef pair<int,int> pi;
const int inf = (int)1e9;
const double INF = 1e12, EPS = 1e-9;

int N, p[2];
ll A[2000][2000], B[2000][2000];
int la[2000], ra[2000];
int lb[2000], rb[2000];

void input(int n, ll a[2000][2000], int *l, int *r){
	
	rep(i, 2000) rep(j, 2000) a[i][j] = 0;
	
	rep(i, 2 * n - 1){
		int len = i < n ? n + i : 3 * n - i - 2;
		int ofs = i < n ? 0 : i - n + 1;
		
		l[i] = ofs;
		r[i] = ofs + len;
		
		rep(j, len){
			int t; scanf("%d", &t);
			
			if(t) rep(k, 64){
				if(ofs + j - k < 0) break;
				a[i][ofs + j - k] |= 1ull << k;
			}
		}
	}
	//rep(i, 2 * n - 1) rep(j, 2 * n - 1) cerr<<(a[i][j]&1)<<(j==2*n-2?"\n":" ");
}

int main(){
	
	scanf("%d%d%d", &N, p, p + 1);
	
	input(N, A, la, ra);
	rep(it, 2){
		input(p[it], B, lb, rb);
		
		assert(p[it]<=N);
		
		bool found = 0;
		
		rep(i, 2 * N - 1) for(int j = la[i]; j < ra[i]; j++){
			
			bool ok = 1;
			
			rep(k, 2 * p[it] - 1){
				
				int len = rb[k] - lb[k];
				int pos = 0;
				
				if(ra[i + k] - j < len){
					ok = 0;
					break;
				}
				
				rep(it, 2){
					
					int clen = min(60, len);
					
					ll x = A[i + k][j + lb[k] + pos] & (1ull << clen) - 1ull;
					ll y = B[k][lb[k] + pos] & (1ull << clen) - 1ull;
					
					/*
					if(i == 2 && j == 1){
						dbg(it); dbg(x); dbg(y);
					}
					*/
					if(x != y){
						ok = 0;
						break;
					}
					
					len -= clen;
					pos += clen;
					if(len <= 0) break;
				}
				if(!ok) break;
			}
			if(ok){
				//cerr<<"i: "<<i<<" j: "<<j<<endl;
				found = 1;
				goto END;
			}
		}
		END:
		if(!found){
			cout << "NO" << endl;
			return 0;
		}
	}
	cout << "YES" << endl;
	
	return 0;
}
accuracy: 0.15384615384615385
time_ms: 10
memory_kb: 63724
final_rank: 2

code_snippet: #include<bits/stdc++.h>

#define rep(i,n) for(int i=0;i<(int)n;i++)
#define all(c) (c).begin(),(c).end()
#define mp make_pair
#define pb push_back
#define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
#define dbg(x) cerr<<__LINE__<<": "<<#x<<" = "<<(x)<<endl

using namespace std;

typedef unsigned long long ll;
typedef vector<int> vi;
typedef pair<int,int> pi;
const int inf = (int)1e9;
const double INF = 1e12, EPS = 1e-9;

int N, p[2];
ll A[2000][2000], B[2000][2000];
int la[2000], ra[2000];
int lb[2000], rb[2000];

void input(int n, ll a[2000][2000], int *l, int *r){
	
	rep(i, 2000) rep(j, 2000) a[i][j] = 0;
	
	rep(i, 2 * n - 1){
		int len = i < n ? n + i : 3 * n - i - 2;
		int ofs = i < n ? 0 : i - n + 1;
		
		l[i] = ofs;
		r[i] = ofs + len;
		
		rep(j, len){
			int t; scanf("%d", &t);
			
			if(t) rep(k, 64){
				if(ofs + j - k < 0) break;
				a[i][ofs + j - k] |= 1ull << k;
			}
		}
	}
	//rep(i, 2 * n - 1) rep(j, 2 * n - 1) cerr<<(a[i][j]&1)<<(j==2*n-2?"\n":" ");
}

int main(){
	
	scanf("%d%d%d", &N, p, p + 1);
	
	input(N, A, la, ra);
	rep(it, 2){
		input(p[it], B, lb, rb);
		assert(p[it] <= 64);
		
		bool found = 0;
		
		rep(i, 2 * N - 1) for(int j = la[i]; j < ra[i]; j++){
			
			bool ok = 1;
			
			rep(k, 2 * p[it] - 1){
				
				int len = rb[k] - lb[k];
				int pos = 0;
				
				if(ra[i + k] - j < len){
					ok = 0;
					break;
				}
				
				rep(it, 2){
					
					int clen = min(60, len);
					
					ll x = A[i + k][j + lb[k] + pos] & (1ull << clen) - 1ull;
					ll y = B[k][lb[k] + pos] & (1ull << clen) - 1ull;
					
					/*
					if(i == 2 && j == 1){
						dbg(it); dbg(x); dbg(y);
					}
					*/
					if(x != y){
						ok = 0;
						break;
					}
					
					len -= clen;
					pos += clen;
					if(len <= 0) break;
				}
				if(!ok) break;
			}
			if(ok){
				//cerr<<"i: "<<i<<" j: "<<j<<endl;
				found = 1;
				goto END;
			}
		}
		END:
		if(!found){
			cout << "NO" << endl;
			return 0;
		}
	}
	cout << "YES" << endl;
	
	return 0;
}
accuracy: 0.15384615384615385
time_ms: 10
memory_kb: 63724
final_rank: 2

code_snippet: #include<bits/stdc++.h>

#define rep(i,n) for(int i=0;i<(int)n;i++)
#define all(c) (c).begin(),(c).end()
#define mp make_pair
#define pb push_back
#define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
#define dbg(x) cerr<<__LINE__<<": "<<#x<<" = "<<(x)<<endl

using namespace std;

typedef unsigned long long ll;
typedef vector<int> vi;
typedef pair<int,int> pi;
const int inf = (int)1e9;
const double INF = 1e12, EPS = 1e-9;

int N, p[2];
ll A[2000][4000], B[2000][4000];
int la[2000], ra[2000];
int lb[2000], rb[2000];

void input(int n, ll a[2000][4000], int *l, int *r){
	
	memset(a, 0, sizeof(A));
	
	rep(i, 2 * n - 1){
		int len = i < n ? n + i : 3 * n - i - 2;
		int ofs = i < n ? 0 : i - n + 1;
		
		l[i] = ofs;
		r[i] = ofs + len;
		
		rep(j, len){
			int t; scanf("%d", &t);
			
			if(t) rep(k, 64){
				if(ofs + j - k < 0) break;
				a[i][ofs + j - k] |= 1ull << k;
			}
		}
	}
	//rep(i, 2 * n - 1) rep(j, 2 * n - 1) cerr<<(a[i][j]&1)<<(j==2*n-2?"\n":" ");
}

int main(){
	
	scanf("%d%d%d", &N, p, p + 1);
	
	input(N, A, la, ra);
	rep(it, 2){
		input(p[it], B, lb, rb);
		assert(p[it] <= 64);
		
		bool found = 0;
		
		rep(i, 2 * N - 1) for(int j = la[i]; j < ra[i]; j++){
			
			bool ok = 1;
			
			rep(k, 2 * p[it] - 1){
				
				int len = rb[k] - lb[k];
				int pos = 0;
				
				if(ra[i + k] - j < len){
					ok = 0;
					break;
				}
				
				rep(it, 2){
					
					int clen = min(64, len);
					
					ll x = A[i + k][j + lb[k] + pos] & (1ull << clen) - 1;
					ll y = B[k][lb[k] + pos];
					
					if(x != y){
						ok = 0;
						break;
					}
					
					len -= clen;
					pos += clen;
					if(len <= 0) break;
				}
				if(!ok) break;
			}
			if(ok){
				//cerr<<"i: "<<i<<" j: "<<j<<endl;
				found = 1;
				goto END;
			}
		}
		END:
		if(!found){
			cout << "NO" << endl;
			return 0;
		}
	}
	cout << "YES" << endl;
	
	return 0;
}
accuracy: 0.15384615384615385
time_ms: 20
memory_kb: 126232
final_rank: 4

code_snippet: #include<bits/stdc++.h>

#define rep(i,n) for(int i=0;i<(int)n;i++)
#define all(c) (c).begin(),(c).end()
#define mp make_pair
#define pb push_back
#define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
#define dbg(x) cerr<<__LINE__<<": "<<#x<<" = "<<(x)<<endl

using namespace std;

typedef unsigned long long ll;
typedef vector<int> vi;
typedef pair<int,int> pi;
const int inf = (int)1e9;
const double INF = 1e12, EPS = 1e-9;

int N, p[2];
ll A[2000][4000], B[2000][4000];
int la[2000], ra[2000];
int lb[2000], rb[2000];

void input(int n, ll a[2000][4000], int *l, int *r){
	
	memset(a, 0, sizeof(A));
	
	rep(i, 2 * n - 1){
		int len = i < n ? n + i : 3 * n - i - 2;
		int ofs = i < n ? 0 : i - n + 1;
		
		l[i] = ofs;
		r[i] = ofs + len;
		
		rep(j, len){
			int t; scanf("%d", &t);
			
			if(t) rep(k, 64){
				if(j - k < 0) break;
				a[i][ofs + j - k] |= 1ull << k;
			}
		}
	}
	//rep(i, 2 * n - 1) rep(j, 2 * n - 1) cerr<<(a[i][j]&1)<<(j==2*n-2?"\n":" ");
}

int main(){
	
	scanf("%d%d%d", &N, p, p + 1);
	
	input(N, A, la, ra);
	rep(it, 2){
		input(p[it], B, lb, rb);
		assert(p[it] <= 64);
		
		bool found = 0;
		
		rep(i, 2 * N - 1) for(int j = la[i]; j < ra[i]; j++){
			
			bool ok = 1;
			
			rep(k, 2 * p[it] - 1){
				
				int len = rb[k] - lb[k];
				int pos = 0;
				
				if(ra[i + k] - j < len){
					ok = 0;
					break;
				}
				
				rep(it, 2){
					
					int clen = min(64, len);
					
					ll x = A[i + k][j + lb[k] + pos] & (1ull << clen) - 1;
					ll y = B[k][lb[k] + pos];
					
					if(x != y){
						ok = 0;
						break;
					}
					
					len -= clen;
					pos += clen;
					if(len <= 0) break;
				}
				if(!ok) break;
			}
			if(ok){
				//cerr<<"i: "<<i<<" j: "<<j<<endl;
				found = 1;
				goto END;
			}
		}
		END:
		if(!found){
			cout << "NO" << endl;
			return 0;
		}
	}
	cout << "YES" << endl;
	
	return 0;
}
accuracy: 0.15384615384615385
time_ms: 20
memory_kb: 126232
final_rank: 4

code_snippet: #include<bits/stdc++.h>

#define rep(i,n) for(int i=0;i<(int)n;i++)
#define all(c) (c).begin(),(c).end()
#define mp make_pair
#define pb push_back
#define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
#define dbg(x) cerr<<__LINE__<<": "<<#x<<" = "<<(x)<<endl

using namespace std;

typedef unsigned long long ll;
typedef vector<int> vi;
typedef pair<int,int> pi;
const int inf = (int)1e9;
const double INF = 1e12, EPS = 1e-9;

int N, p[2];
ll A[2000][4000], B[2000][4000];
int la[2000], ra[2000];
int lb[2000], rb[2000];

void input(int n, ll a[2000][4000], int *l, int *r){
	
	memset(a, 0, sizeof(A));
	
	rep(i, 2 * n - 1){
		int len = i < n ? n + i : 3 * n - i - 2;
		int ofs = i < n ? 0 : i - n + 1;
		
		l[i] = ofs;
		r[i] = ofs + len;
		
		rep(j, len){
			int t; scanf("%d", &t);
			
			if(t) rep(k, 64){
				if(j - k < 0) break;
				a[i][ofs + j - k] |= 1ull << k;
			}
		}
	}
	//rep(i, 2 * n - 1) rep(j, 2 * n - 1) cerr<<(a[i][j]&1)<<(j==2*n-2?"\n":" ");
}

int main(){
	
	scanf("%d%d%d", &N, p, p + 1);
	
	input(N, A, la, ra);
	rep(it, 2){
		input(p[it], B, lb, rb);
		
		bool found = 0;
		
		rep(i, 2 * N - 1) for(int j = la[i]; j < ra[i]; j++){
			
			bool ok = 1;
			
			rep(k, 2 * p[it] - 1){
				
				int len = rb[k] - lb[k];
				int pos = 0;
				
				if(ra[i + k] - j < len){
					ok = 0;
					break;
				}
				
				rep(it, 2){
					
					int clen = min(64, len);
					
					ll x = A[i + k][j + lb[k] + pos] & (1ull << clen) - 1;
					ll y = B[k][lb[k] + pos];
					
					if(x != y){
						ok = 0;
						break;
					}
					
					len -= clen;
					pos += clen;
					if(len <= 0) break;
				}
				if(!ok) break;
			}
			if(ok){
				//cerr<<"i: "<<i<<" j: "<<j<<endl;
				found = 1;
				goto END;
			}
		}
		END:
		if(!found){
			cout << "NO" << endl;
			return 0;
		}
	}
	cout << "YES" << endl;
	
	return 0;
}
accuracy: 0.15384615384615385
time_ms: 20
memory_kb: 126236
final_rank: 6