Submission #445985

#TimeUsernameProblemLanguageResultExecution timeMemory
445985JasiekstrzSateliti (COCI20_satellti)C++17
50 / 110
3061 ms33480 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const int N=1e3;
char c[N+10][N+10];
int tab[N+10][N+10];
int tmptab[N+10][N+10];
int ord[N+10][N+10];
int val[2*N*N+N+10];
int nval[2*N*N+N+10];
int srt[2*N*N+10];
void kmr(int n,int m)
{
	auto id=[&m](int x,int y)
	{
		return (x-1)*2*m+y;
	};

	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=2*m;j++)
		{
			srt[id(i,j)]=id(i,j);
			val[id(i,j)]=tab[i][(j-1)%m+1];
		}
	}

	auto step_kmr=[&n,&m](int pot)
	{
		sort(srt+1,srt+n*2*m+1,[&pot](int a,int b){ 
				return (val[a]<val[b] || (val[a]==val[b] && val[a+pot]<val[b+pot])); });
		for(int i=1,it=0;i<=n*2*m;i++)
		{
			if(val[srt[i]]==val[srt[i-1]] && val[srt[i]+pot]==val[srt[i-1]+pot])
				nval[srt[i]]=it;
			else
				nval[srt[i]]=++it;
		}
		for(int i=1;i<=n*2*m;i++)
			val[i]=nval[i];
		return;
	};

	int pot;
	for(pot=2;pot<m;pot*=2)
		step_kmr(pot/2);
	pot/=2;
	step_kmr(m-pot);

	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			tab[i][j]=val[id(i,j)];
	}
	return;
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>c[i][j];
			tab[i][j]=c[i][j];
		}
	}

	auto rot=[](int n,int m)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
				tmptab[i][j]=tab[i][j];
		}
		for(int i=1;i<=m;i++)
		{
			for(int j=1;j<=n;j++)
				tab[i][j]=tmptab[j][i];
		}
		return;
	};

	kmr(n,m);

	//for(int i=1;i<=n;i++)
	//{
	//	for(int j=1;j<=m;j++)
	//		cerr<<tab[i][j]<<" ";
	//	cerr<<"\n";
	//}
	
	rot(n,m);

	//for(int i=1;i<=m;i++)
	//{
	//	for(int j=1;j<=n;j++)
	//		cerr<<tab[i][j]<<" ";
	//	cerr<<"\n";
	//}

	kmr(m,n);

	//for(int i=1;i<=m;i++)
	//{
	//	for(int j=1;j<=n;j++)
	//		cerr<<tab[i][j]<<" ";
	//	cerr<<"\n";
	//}

	rot(m,n);

	//for(int i=1;i<=n;i++)
	//{
	//	for(int j=1;j<=m;j++)
	//		cerr<<tab[i][j]<<" ";
	//	cerr<<"\n";
	//}

	pair<int,int> g={1,1};
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(tab[i][j]<tab[g.fi][g.se])
				g={i,j};
		}
	}

	for(int i=g.fi;i<g.fi+n;i++)
	{
		for(int j=g.se;j<g.se+m;j++)
			cout<<c[(i-1)%n+1][(j-1)%m+1];
		cout<<"\n";
	}
	return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...