답안 #533811

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
533811 2022-03-07T10:52:35 Z maximath_1 Sateliti (COCI20_satellti) C++11
110 / 110
491 ms 74220 KB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
const int MX = 2005;
const ll mod = 420691273;

int n, m;
string G[MX]; int grd[MX][MX];
ll p[MX][MX], pref[MX][MX]; // 2d hashing

ll query(int x, int y, int sx, int sy){
	ll get = pref[x + sx][y + sy] + pref[x][y];
	(get += (mod - pref[x + sx][y]) + (mod - pref[x][y + sy])) %= mod;
	if(get < 0) get += mod;
	return get;
}

bool check_eq(int ax, int ay, int bx, int by, int sx, int sy){
	ll geta = (query(ax, ay, sx, sy) * 1ll * p[bx][by]) % mod;
	ll getb = (query(bx, by, sx, sy) * 1ll * p[ax][ay]) % mod;
	if(geta < 0) geta += mod;
	if(getb < 0) getb += mod;
	if(geta == getb) return true;
	return false;
}

int main(){
	cin.tie(0) -> sync_with_stdio(0);

	cin >> n >> m;
	for(int i = 0; i < n; i ++){
		cin >> G[i];
		for(int j = 0; j < m; j ++)
			grd[i][j] = (G[i][j] == '*' ? 1 : 0);
	}

	for(int i = 0; i < MX; i ++){
		for(int j = 0; j < MX; j ++){
			if(i == 0){
				if(j == 0) p[i][j] = 1ll;
				else p[i][j] = (p[i][j - 1] * 3ll) % mod;
			}else p[i][j] = (p[i - 1][j] * 2ll) % mod;
			if(p[i][j] < 0) p[i][j] += mod;
		}
	}

	for(int i = 0; i < 2 * n; i ++)
		for(int j = 0; j < 2 * m; j ++){
			pref[i + 1][j + 1] = ((grd[i % n][j % m] * 1ll * p[i][j]) % mod 
				+ pref[i + 1][j] + pref[i][j + 1] + mod - pref[i][j]) % mod;
			if(pref[i + 1][j + 1] < 0) pref[i + 1][j + 1] += mod;
		}

	int ansx = 0, ansy = 0;

	for(int x = 0; x < n; x ++){
		for(int y = 0; y < m; y ++){
			int lf = 0, rg = n - 1, dx = 0;
			for(int md; lf <= rg;){
				md = (lf + rg) / 2;
				if(check_eq(ansx, ansy, x, y, md, m)){
					dx = md;
					lf = md + 1;
				}else rg = md - 1;
			}
			lf = 0, rg = m - 1; int dy = 0;
			for(int md; lf <= rg;){
				md = (lf + rg) / 2;
				if(check_eq(ansx + dx, ansy, x + dx, y, 1, md)){
					dy = md; lf = md + 1;
				}else rg = md - 1;
			}

			if(G[(x + dx) % n][(y + dy) % m] == '*' && G[(ansx + dx) % n][(ansy + dy) % m] == '.'){
				ansx = x; ansy = y;
			}
		}
	}

	for(int i = 0; i < n; i ++){
		for(int j = 0; j < m; j ++)
			cout << G[(ansx + i) % n][(ansy + j) % m];
		cout << endl;
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 32452 KB Output is correct
2 Correct 25 ms 32368 KB Output is correct
3 Correct 20 ms 32452 KB Output is correct
4 Correct 20 ms 32460 KB Output is correct
5 Correct 20 ms 32452 KB Output is correct
6 Correct 19 ms 32460 KB Output is correct
7 Correct 18 ms 32460 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 32452 KB Output is correct
2 Correct 25 ms 32368 KB Output is correct
3 Correct 20 ms 32452 KB Output is correct
4 Correct 20 ms 32460 KB Output is correct
5 Correct 20 ms 32452 KB Output is correct
6 Correct 19 ms 32460 KB Output is correct
7 Correct 18 ms 32460 KB Output is correct
8 Correct 52 ms 38548 KB Output is correct
9 Correct 20 ms 32044 KB Output is correct
10 Correct 19 ms 35460 KB Output is correct
11 Correct 52 ms 38572 KB Output is correct
12 Correct 55 ms 38768 KB Output is correct
13 Correct 53 ms 38796 KB Output is correct
14 Correct 56 ms 38816 KB Output is correct
15 Correct 54 ms 38852 KB Output is correct
16 Correct 56 ms 38860 KB Output is correct
17 Correct 59 ms 38820 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 32452 KB Output is correct
2 Correct 25 ms 32368 KB Output is correct
3 Correct 20 ms 32452 KB Output is correct
4 Correct 20 ms 32460 KB Output is correct
5 Correct 20 ms 32452 KB Output is correct
6 Correct 19 ms 32460 KB Output is correct
7 Correct 18 ms 32460 KB Output is correct
8 Correct 52 ms 38548 KB Output is correct
9 Correct 20 ms 32044 KB Output is correct
10 Correct 19 ms 35460 KB Output is correct
11 Correct 52 ms 38572 KB Output is correct
12 Correct 55 ms 38768 KB Output is correct
13 Correct 53 ms 38796 KB Output is correct
14 Correct 56 ms 38816 KB Output is correct
15 Correct 54 ms 38852 KB Output is correct
16 Correct 56 ms 38860 KB Output is correct
17 Correct 59 ms 38820 KB Output is correct
18 Correct 452 ms 74052 KB Output is correct
19 Correct 28 ms 44228 KB Output is correct
20 Correct 25 ms 32612 KB Output is correct
21 Correct 429 ms 74016 KB Output is correct
22 Correct 461 ms 74052 KB Output is correct
23 Correct 424 ms 74124 KB Output is correct
24 Correct 491 ms 74220 KB Output is correct
25 Correct 442 ms 74084 KB Output is correct
26 Correct 460 ms 74056 KB Output is correct
27 Correct 455 ms 73968 KB Output is correct