Submission #1182798

#TimeUsernameProblemLanguageResultExecution timeMemory
1182798nikolashamiSateliti (COCI20_satellti)C++20
110 / 110
655 ms64144 KiB
#include<bits/stdc++.h>
using namespace std;
using ll=long long;

const ll N=2e3+2;
ll a[N][N],n,m;

const ll T1=2,T2=3,mod=INT_MAX-170;
ll h[N][N],pw1[N],pw2[N],i1[N],i2[N];

ll pw(ll x,ll y){
	ll r=1;x%=mod;
	while(y){
		if(y&1)r=(r*x)%mod;
		x=(x*x)%mod;
		y>>=1;
	}
	return r;
}

ll inv(ll x){
	return pw(x,mod-2);
}

ll get(ll r1,ll c1,ll r2,ll c2){
	ll ret=(h[r2][c2]-h[r1-1][c2]-h[r2][c1-1]+h[r1-1][c1-1]+2*mod)%mod;
	ret=(ret*i1[r1])%mod;
	ret=(ret*i2[c1])%mod;
	return ret;
}

bool cmp(const array<ll,2>&x,const array<ll,2>&y){
	array<ll,2>ans={0,0};
	ll l=1,r=n*m;
	while(l<=r){
		ll md=(l+r)/2,ii=(md+m-1)/m,jj=(md)%m;
		if(!jj)jj+=m;
		bool ok=!(ii>1&&(get(x[0],x[1],x[0]+ii-2,x[1]+m-1)!=get(y[0],y[1],y[0]+ii-2,y[1]+m-1)));
		ok&=(get(x[0]+ii-1,x[1],x[0]+ii-1,x[1]+jj-1)==get(y[0]+ii-1,y[1],y[0]+ii-1,y[1]+jj-1));
		if(ok)l=md+1;
		else{
			ans={ii-1,jj-1};
			r=md-1;
		}
	}
	return(a[x[0]+ans[0]][x[1]+ans[1]]);
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin>>n>>m;
    for(int i=1;i<=n;++i){
    	for(int j=1;j<=m;++j){
    		char c;cin>>c;
    		a[i][j]=(c=='.');
    	}
    }

    for(int i=1;i<=2*n;++i){
    	for(int j=1;j<=2*m;++j)
    		a[i][j]=a[(i>n?i-n:i)][(j>m?j-m:j)];
    }

    pw1[0]=pw2[0]=1;
    i1[0]=i2[0]=inv(1);
    for(int i=1;i<N;++i){
    	pw1[i]=pw1[i-1]*T1%mod;
    	pw2[i]=pw2[i-1]*T2%mod;
    	i1[i]=inv(pw1[i]);
    	i2[i]=inv(pw2[i]);
    }

    for(int i=1;i<=2*n;++i){
    	for(int j=1;j<=2*m;++j){
    		ll x=(a[i][j]*pw1[i]%mod*pw2[j]%mod)+mod;
    		h[i][j]=(h[i-1][j]+h[i][j-1]-h[i-1][j-1]+x)%mod;
    	}
    }

    array<ll,2>mx={1,1};
    for(int i=1;i<=n;++i){
    	for(int j=1;j<=m;++j)
    		if(!cmp({i,j},mx))mx={i,j};
    }

    for(int i=mx[0];i<mx[0]+n;++i){
    	for(int j=mx[1];j<mx[1]+m;++j)
    		cout<<(!a[i][j]?'*':'.');
    	cout<<'\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...