Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- string Read(){
- const int MaxN = 2e5 + 5e2;
- static char Buff[MaxN];
- scanf("\n%s" ,Buff);
- return Buff;
- }
- void CountSort(vector< int > &SA ,vector< int > &RA ,int k ,int n ,int N = 350){
- vector< int > c(N ,0);
- vector< int > tempSA(n);
- for(int i = 0 ; i < n ; i++)
- c[ (i + k >= n) ? 0 : RA[i + k] ] ++;
- for(int i = 0, sum = 0 ; i < N ; i++){
- int t = c[i];
- c[i] = sum;
- sum += t;
- }
- for(int i = 0 ; i < n ; i++)
- tempSA[ c[ ((SA[i] + k) < n) ? RA[ SA[i] + k ] : 0] ++ ] = SA[i];
- for(int i = 0 ; i < n ; i++) SA[i] = tempSA[i];
- }
- vector< int > ConstructSA(string &s ,int n){
- int r = 0;
- vector< int > tempRA(n);
- vector< int > SA(n) ,RA(n);
- for(int i = 0 ; i < n ; i++) RA[i] = (int)s[i];
- for(int i = 0 ; i < n ; i++) SA[i] = i;
- for(int k = 1 ; k < n && (RA[ SA[n - 1] ] != n - 1) ; k <<= 1){
- CountSort(SA ,RA ,k ,n);
- CountSort(SA ,RA ,0 ,n);
- tempRA[ SA[0] ] = r = 0;
- for(int i = 1 ; i < n ; i++) tempRA[ SA[i] ] =
- (RA[ SA[i] ] == RA[ SA[i - 1] ] && RA[ SA[i] + k ] == RA[ SA[i - 1] + k ]) ? r : ++r;
- for(int i = 0 ; i < n ; i++) RA[i] = tempRA[i];
- }
- return SA;
- }
- int main() {
- string F = Read() + '$';
- string M = Read() + '$';
- int n = (int)F.size();
- int m = (int)M.size();
- vector< int > SuffF = ConstructSA(F ,n);
- vector< int > SuffM = ConstructSA(M ,m);
- string mxF ,mxM;
- for(int i = SuffF[n - 1] ; i < n ; i++) mxF += F[i];
- for(int i = SuffM[m - 1] ; i < m ; i++) mxM += M[i];
- bool flag = false;
- for(auto i : mxF){
- if( flag ) {
- if( i < mxM[0] ) break;
- if( i != '$' ) printf("%c" ,i);
- } else {
- if( i != '$' ) printf("%c" ,i);
- flag = true;
- }
- }
- for(auto i : mxM)
- if( i != '$' ) printf("%c" ,i);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement