2 条题解
-
0
#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
#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
- 上传者