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...