为什么写基数排序倍增比快排倍增还慢?
查看原帖
为什么写基数排序倍增比快排倍增还慢?
142327
C6H2CH3_NO2_3楼主2024/11/18 22:47
#include<bits/stdc++.h>
#define ll long long
#define maxn 1000005
using namespace std;
ll input(){
	ll ans=0;
	char c=getchar();
	bool flag=0;
	while(c<'0'||c>'9'){
		if(c=='-')flag=1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		ans=ans*10+c-'0';
		c=getchar();
	}
	if(flag)ans=-ans;
	return ans;
}
void print(ll ans,char c=0,bool flag=1){
    if(ans<0){
        putchar('-');
        ans=-ans;
    }
    if(ans>=10)print(ans/10,c,0);
    putchar('0'+ans%10);
    if(flag&&c!=0)putchar(c);
}
struct aaa{
	ll id;
	ll first,second;
}op[maxn];
bool cmp(aaa a,aaa b){
	if(a.first<b.first)return 1;
	if(a.first>b.first)return 0;
	return (a.second<b.second);
}
string s;
ll sa[maxn],rk[maxn],height[maxn];
void printRk(){
	cout<<"Rank:"<<endl;
	for(ll i=0;i<s.size();i++)
	print(rk[i],' ');
	putchar('\n');
}
ll Power(ll d,ll z){
	if(z==0)return 1;
	ll ans=1,k=Power(d,(z>>1));
	if(z&1)ans=k*k*d;
	else ans=k*k;
	return ans;
}
ll check(ll x,ll i){
	x/=Power(10,i);
	return x%10;
}
void Sort(){
	queue< aaa >s1;
	aaa a[11][1000000];
	ll cnt[11]={0};
	for(ll i=0;i<s.size();i++){
		s1.push(op[i]);
	}
	for(ll i=0;i<=5;i++){
		for(ll j=0;j<s.size();j++){
		aaa now=s1.front();
		s1.pop();		
		if(now.second>=0){
		ll kk=check(now.second,i);
		a[kk][cnt[kk]++]=now;
	    }
		else a[10][cnt[10]++]=now;
	    }
		for(ll k=10;1;k++){
			for(ll o=0;o<cnt[k];o++){
				s1.push(a[k][o]);
			}
			cnt[k]=0;
			if(k==10)k=-1;
			if(k==9)break;
		}	
	}	
	for(ll i=0;i<=5;i++){
		for(ll j=0;j<s.size();j++){
		aaa now=s1.front();
		s1.pop();
		ll kk=check(now.first,i);
		a[kk][cnt[kk]++]=now;
	    }
		for(ll k=0;k<=9;k++){
			for(ll o=0;o<cnt[k];o++){
				s1.push(a[k][o]);
			}
			cnt[k]=0;
		}		
	}

	for(ll j=0;j<s.size();j++){
		op[j]=s1.front();
		s1.pop();
	}
}
int main(){
    cin>>s;
    for(ll i=0;i<s.size();i++){
    	op[i].id=i;
    	op[i].first=op[i].second=(ll)(s[i]);
	}
//	sort(op,op+s.size(),cmp);
    Sort();	
	for(ll i=0,j=0;i<s.size();i++){
		if(i!=0&&op[i].first!=op[i-1].first)j++;
		rk[op[i].id]=j;
	}
	for(ll i=1;i<s.size();i=(i<<1)){
		for(ll j=0;j<s.size();j++){
			op[j].id=j;
			op[j].first=rk[j];
			if(j+i<s.size())op[j].second=rk[j+i];
			else op[j].second=-1;
		}
		Sort();
		for(ll i=0,j=0;i<s.size();i++){
		if(i!=0&&(op[i].first!=op[i-1].first||op[i].second!=op[i-1].second))j++;
		rk[op[i].id]=j;
	    }
	}
	for(ll i=0;i<s.size();i++){
		sa[rk[i]]=i;
	}
	for(ll i=0;i<s.size();i++)print(sa[i]+1,' ');
    return 0;
}

巨佬们帮忙看下基数排序写得有问题没有,谢谢啦

2024/11/18 22:47
加载中...