首页 > 代码库 > 基数排序的奇技淫巧
基数排序的奇技淫巧
据说是WC T2的子任务,ai<=2^32-1的基数排序,那么就把一个数分成几段多关键字基数排序就行了,类似后缀数组?
分成8位/8位/8位/8位比分成16位/16位要快【丧病的底层优化
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[100001],b[100001],c[100001],d[100001],sa[100001],sa2[100001],sa3[100001],sa4[100001],sum[257],n; int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i]>>16&((1<<8)-1),c[i]=a[i]>>8&((1<<8)-1),d[i]=a[i]&((1<<8)-1); for(int i=1;i<=n;i++)sum[d[i]]++; for(int i=1;i<=256;i++)sum[i]+=sum[i-1]; for(int i=n;i>=1;i--)sa4[sum[d[i]]]=i,sum[d[i]]--; memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++)sum[c[i]]++; for(int i=1;i<=256;i++)sum[i]+=sum[i-1]; for(int i=n;i>=1;i--)sa3[sum[c[sa4[i]]]]=sa4[i],sum[c[sa4[i]]]--; memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++)sum[b[i]]++; for(int i=1;i<=256;i++)sum[i]+=sum[i-1]; for(int i=n;i>=1;i--)sa2[sum[b[sa3[i]]]]=sa3[i],sum[b[sa3[i]]]--; memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++)sum[a[i]>>16]++; for(int i=1;i<=256;i++)sum[i]+=sum[i-1]; for(int i=n;i>=1;i--)sa[sum[a[sa2[i]]>>16]]=sa2[i],sum[a[sa2[i]]>>16]--; for(int i=1;i<=n;i++)printf("%d ",a[sa[i]]); }
基数排序的奇技淫巧
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。