2 条题解

  • 0
    @ 2025-10-8 17:10:05
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=4e5+10;
    int mod=1e9+7;
    int base=13331;
    int a[N],b[N],n,m;
    int pw[N],hs[N];
    void build(){//哈希
        pw[0]=1;
        for(int i=1;i<=n+m+2;i++){
            hs[i]=(hs[i-1]*base+a[i])%mod; 
            pw[i]=(pw[i-1]*base)%mod;
        }
    }
    int get(int l,int r){//查询
        if(l>r) return 0;
        return ((hs[r]-hs[l-1]*pw[r-l+1])%mod+mod)%mod;
    }
    bool erfen(int i,int j){//二分
        int l=0,r=min(n+m+2-i,n+m+2-j);//r的边界处理,不然会越界
        int lcp;
        while(l<=r){
            int mid=(l+r)/2;
            if(get(i,i+mid-1)==get(j,j+mid-1)){
                lcp=mid;
                l=mid+1;
            }else r=mid-1;
        }
        if(i+lcp>n+m+2) return 1;//i后缀更短
        if(j+lcp>n+m+2) return 0;//j后缀更短
        return a[i+lcp]<a[j+lcp];//比较LCP后的第一个字符
    }
    signed main(){
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        a[n+1]=1e9+1;//分界处理
        cin>>m;
        for(int i=1;i<=m;i++) cin>>a[n+i+1];
        a[n+m+2]=1e9+1;//分界处理
        build();//用同一个哈希数组
        int i=1,j=n+2;
        while(i<=n||j<=n+m+1){//合并(直接输出)
            if(j>n+m+1) cout<<a[i++]<<" ";
            else if(i>n) cout<<a[j++]<<" ";
            else{
                if(erfen(i,j)){
                    cout<<a[i++]<<" ";
                }else cout<<a[j++]<<" ";
            }
        }
    }
    
    • 0
      @ 2025-10-8 17:09:59
      #include<bits/stdc++.h>
      #define int long long
      using namespace std;
      const int N=4e5+10;
      int mod=1e9+7;
      int base=13331;
      int a[N],b[N],n,m;
      int pw[N],hs[N];
      void build(){//哈希
          pw[0]=1;
          for(int i=1;i<=n+m+2;i++){
              hs[i]=(hs[i-1]*base+a[i])%mod; 
              pw[i]=(pw[i-1]*base)%mod;
          }
      }
      int get(int l,int r){//查询
          if(l>r) return 0;
          return ((hs[r]-hs[l-1]*pw[r-l+1])%mod+mod)%mod;
      }
      bool erfen(int i,int j){//二分
          int l=0,r=min(n+m+2-i,n+m+2-j);//r的边界处理,不然会越界
          int lcp;
          while(l<=r){
              int mid=(l+r)/2;
              if(get(i,i+mid-1)==get(j,j+mid-1)){
                  lcp=mid;
                  l=mid+1;
              }else r=mid-1;
          }
          if(i+lcp>n+m+2) return 1;//i后缀更短
          if(j+lcp>n+m+2) return 0;//j后缀更短
          return a[i+lcp]<a[j+lcp];//比较LCP后的第一个字符
      }
      signed main(){
          cin>>n;
          for(int i=1;i<=n;i++) cin>>a[i];
          a[n+1]=1e9+1;//分界处理
          cin>>m;
          for(int i=1;i<=m;i++) cin>>a[n+i+1];
          a[n+m+2]=1e9+1;//分界处理
          build();//用同一个哈希数组
          int i=1,j=n+2;
          while(i<=n||j<=n+m+1){//合并(直接输出)
              if(j>n+m+1) cout<<a[i++]<<" ";
              else if(i>n) cout<<a[j++]<<" ";
              else{
                  if(erfen(i,j)){
                      cout<<a[i++]<<" ";
                  }else cout<<a[j++]<<" ";
              }
          }
      }
      • 1

      信息

      ID
      5943
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      1
      已通过
      1
      上传者