求助为什么用 vector 实现基数排序会 MLE
查看原帖
求助为什么用 vector 实现基数排序会 MLE
83353
XLao楼主2023/1/4 11:47

rt

就是代码没有使用计数排序。

vector 不应该是动态开空间的吗。

#include<bits/stdc++.h>
using namespace std;

const int N=1e6+1;

char s[N];

int n,sa[N<<1],rk[N<<1],rk2[N<<1];
vector<int> t1[N],t2[N];
bool cmp(int x,int y) {return s[x]<s[y];}

int main()
{
	scanf("%s",s+1); n=strlen(s+1);
	for(int i=1;i<=n;++i) sa[i]=i;
	sort(sa+1,sa+n+1,cmp);
	for(int i=1,tot=0;i<=n;++i)
	{
		if(i>1 && s[sa[i-1]]==s[sa[i]]) rk[sa[i]]=tot;
		else rk[sa[i]]=++tot;
	}
	for(int len=1;len<=n;len<<=1)
	{
		int r=0;
		for(int i=1;i<=n;++i)
		{
			t2[rk[i+len]].push_back(i);
			r=max(r,rk[i+len]);
		}
		for(int i=0;i<=r;++i)
		{
			for(int x : t2[i])
				t1[rk[x]].push_back(x);
			t2[i].clear();
		}
		int bj=0;
		for(int i=1,tot=0; i<=n && !t1[i].empty(); ++i)
		{
			int pre=t1[i][0];
			rk2[pre]=++tot;
			for(int x : t1[i])
			{
				if(x==pre) continue;
				if(rk[pre+len]==rk[x+len]) bj=1, rk2[x]=tot;
				else rk2[x]=++tot;
				pre=x;
			}
			t1[i].clear();
		}
		memcpy(rk,rk2,sizeof rk2);
		if(!bj) break;
	}
	for(int i=1;i<=n;++i) sa[rk[i]]=i;
	for(int i=1;i<=n;++i) printf("%d ",sa[i]);
}
2023/1/4 11:47
加载中...