제출 #373352

#제출 시각아이디문제언어결과실행 시간메모리
373352sam571128Sateliti (COCI20_satellti)C++14
110 / 110
686 ms77164 KiB
#include <bits/stdc++.h>

#define int long long
#define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;

const int N = 2e3+5, MOD = 998244353, p = 11, q = 17;
int grid[N][N], pp[N], qp[N], h[N][N], sum[N][N];

int n,m;
int ansx, ansy;

void precompute(){
	pp[0] = 1;
	qp[0] = 1;
	for(int i = 1;i < N;i++){
		pp[i] = pp[i-1]*p%MOD;
		qp[i] = qp[i-1]*q%MOD;
	}
	for(int i = 0;i < 2*n;i++){
		for(int j = 0;j < 2*m;j++){
			h[i][j] = grid[i%n][j%m]*pp[i]%MOD*qp[j]%MOD;
		}
	}
	for(int i = 0;i < 2*n;i++){
		for(int j = 0;j < 2*m;j++){
			sum[i+1][j+1] = (h[i][j]+sum[i+1][j]+sum[i][j+1]-sum[i][j]);
		}
	}
}

bool check(int x1, int y1, int x2, int y2, int dx, int dy){
	return (((sum[x1+dx][y1+dy]-sum[x1+dx][y1]-sum[x1][y1+dy]+sum[x1][y1])%MOD+MOD)%MOD*pp[x2]%MOD*qp[y2]%MOD == ((sum[x2+dx][y2+dy]-sum[x2+dx][y2]-sum[x2][y2+dy]+sum[x2][y2])%MOD+MOD)%MOD*pp[x1]%MOD*qp[y1]%MOD);
}

signed main(){
	fastio
	cin >> n >> m;
	for(int i = 0;i < n;i++){
		for(int j = 0;j < m;j++){
			char c;
			cin >> c;
			if(c=='.') grid[i][j] = 1;
		}
	}

	precompute();
	for(int i = 0;i < n;i++){
		for(int j = 0;j < m;j++){
			int l = 0, r = n;
			while(l+1 < r){
				int mid = l+r>>1;
				if(check(i,j,ansx,ansy,mid,m)) l = mid;
				else r = mid;
			}
			int dx = l;
			l = 0, r = m;
			while(l+1 < r){
				int mid = l+r>>1;
				if(check(i+dx,j,ansx+dx,ansy,1,mid)) l = mid;
				else r = mid;
			}
			int dy = l;

			if(grid[(i+dx)%n][(j+dy)%m] <= grid[(ansx+dx)%n][(ansy+dy)%m]){
				ansx = i;
				ansy = j;
			}
		}
	}
	for(int i = 0;i < n;i++){
		for(int j = 0;j < m;j++){
			cout << (grid[(ansx+i)%n][(ansy+j)%m] ? '.' : '*');
		}
		cout << "\n";
	}
}

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int main()':
Main.cpp:53:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   53 |     int mid = l+r>>1;
      |               ~^~
Main.cpp:60:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   60 |     int mid = l+r>>1;
      |               ~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...