제출 #1219390

#제출 시각아이디문제언어결과실행 시간메모리
1219390rcllSateliti (COCI20_satellti)C++20
110 / 110
392 ms75888 KiB
#include <bits/stdc++.h> using namespace std; #define int long long 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() { 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'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...