Submission #1206550

#TimeUsernameProblemLanguageResultExecution timeMemory
1206550_rain_Sateliti (COCI20_satellti)C++20
110 / 110
225 ms28860 KiB
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=(int)2000; const int MOD=1e9+9; const int base=9973; char c[N+2][N+2]; int numrow,numcol; int length,need_row; void build_board(){ for(int i=1;i<=numrow;++i){ for(int j=numcol+1;j<=2*numcol;++j) { c[i][j]=c[i][j-numcol]; } } for(int i=numrow+1;i<=2*numrow;++i){ for(int j=1;j<=numcol;++j) { c[i][j]=c[i-numrow][j]; } } for(int i=numrow+1;i<=2*numrow;++i){ for(int j=numcol+1;j<=2*numcol;++j){ c[i][j]=c[i-numrow][j-numcol]; } } return; } int p[N+2]; int cot[2][N+2][N+2]; int Get(int t,int id,int l,int r){ return ((LL)cot[t][id][r]-(LL)cot[t][id][l-1]*p[r-l+1]+(LL)MOD*MOD)%MOD; } //... COMPARE THE FUNCTION int cmp_cot(pair<int,int>a,pair<int,int>b){ int low=1,high=need_row,p=0; while (low<=high){ int mid=(low+high)/2; if (Get(1,a.second,a.first,a.first+mid-1)==Get(1,b.second,b.first,b.first+mid-1)){ p=mid; low=mid+1; } else high=mid-1; } return p; } bool compares(pair<int,int>a,pair<int,int>b){ int r=cmp_cot(a,b); if (r==need_row) return false; int low=1,high=length,p=0; while (low<=high){ int mid=(low+high)/2; if (Get(0,a.first+r,a.second,a.second+mid-1)==Get(0,b.first+r,b.second,b.second+mid-1)){ p=mid; low=mid+1; } else high=mid-1; } if (p==length) return false; return c[a.first+r][a.second+p]>c[b.first+r][b.second+p]; } int main(){ ios::sync_with_stdio(false); cin.tie(0) ; cout.tie(0); #define task "main" if (fopen(task".inp","r")){ freopen(task".inp","r",stdin); freopen(task".out","w",stdout); } cin>>numrow>>numcol; for(int i=1;i<=numrow;++i){ for(int j=1;j<=numcol;++j){ cin>>c[i][j]; } } build_board(); numrow=2*numrow; numcol=2*numcol; length=numcol/2; need_row=numrow/2; p[0]=1; for(int i=1;i<=N;++i) p[i]=(LL)p[i-1]*base%MOD; for(int i=1;i<=numrow;++i) { for(int j=1;j<=numcol;++j){ cot[0][i][j]=((LL)cot[0][i][j-1]*base+c[i][j]-'a'+1)%MOD; } } for(int j=1;j<=length;++j){ for(int i=1;i<=numrow;++i){ int x=Get(0,i,j,j+length-1); cot[1][j][i]=((LL)cot[1][j][i-1]*base+x)%MOD; } } pair<int,int>final={1,1}; for(int i=1;i<=need_row;++i){ for(int j=1;j<=length;++j){ if (compares(final,{i,j})) final={i,j}; } } for(int i=final.first;i<=final.first+need_row-1;++i){ for(int j=final.second;j<=final.second+length-1;++j){ cout<<c[i][j]; } cout<<'\n'; } }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:74:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   74 |                 freopen(task".inp","r",stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Main.cpp:75:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |                 freopen(task".out","w",stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...