社区讨论

为啥 sort 能直接过,玄关

P3809【模板】后缀排序参与者 4已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@mi7b9m9g
此快照首次捕获于
2025/11/20 18:51
4 个月前
此快照最后确认于
2025/11/21 00:19
4 个月前
查看原帖
RT,如下代码
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
string s;
int n,sa[N],rk[2][N<<1];
bool tot;
int l;
bool cmp(int x,int y){
	if(rk[!tot][x]==rk[!tot][y]){
		return rk[!tot][min(n+1,x+l)]<rk[!tot][min(n+1,y+l)];
	}
	return rk[!tot][x]<rk[!tot][y];
}
int main(){
	cin>>s;
	n=s.size();
	s=' '+s;
	for(int i=1;i<=n;i++)sa[i]=i,rk[tot][i]=s[i];
	l=1,tot=0;
	while(l<n){
		tot=!tot;
		sort(sa+1,sa+n+1,cmp);
		int p=0;
		for(int i=1;i<=n;i++){
			if(i==1)rk[tot][sa[i]]=++p;
			else if(rk[!tot][sa[i]]==rk[!tot][sa[i-1]]
			&&rk[!tot][min(n+1,sa[i]+l)]==rk[!tot][min(n+1,sa[i-1]+l)])
				rk[tot][sa[i]]=p;
			else rk[tot][sa[i]]=++p;
		}
		l<<=1;
	}
	for(int i=1;i<=n;i++)cout<<sa[i]<<' ';
	cout<<endl;
	return 0;
}
能直接水过,虽然需要6.93s
求大佬解答

回复

13 条回复,欢迎继续交流。

正在加载回复...