CF上能AC,这里TLE了?
查看原帖
CF上能AC,这里TLE了?
132976
huayucaiji楼主2020/8/4 19:01

rt,哪里写错了求大佬查错/kel

//Don't act like a loser.
//You can only use the sode for studying or finding mistakes
//Or,you'll be punished by Sakyamuni!!!
#include<bits/stdc++.h>
using namespace std;

const int maxn=1e6+10; 

int n,w[maxn],sa[maxn],rnk[maxn],a[maxn],b[maxn],cnt[maxn],t[maxn],m;

void bucket_sort(int* x) {
	fill(cnt,cnt+m+1,0);
	for(int i=1;i<=n;i++) {
		cnt[x[i]+1]++;
	}
	for(int i=1;i<=m;i++) {
		cnt[i]+=cnt[i-1];
	}
	for(int i=1;i<=n;i++) {
		t[++cnt[x[sa[i]]]]=sa[i];
	}
	for(int i=1;i<=n;i++) {
		sa[i]=t[i];
	}
}

void get_rank() {
	m=0;
	rnk[sa[1]]=++m;
	for(int i=2;i<=n;i++) {
		if(a[sa[i]]!=a[sa[i-1]]||b[sa[i]]!=b[sa[i-1]]) {
			m++;
		}
		rnk[sa[i]]=m;
	}
}

void suffix_array() {
	for(int i=1;i<=n;i++) {
		a[i]=w[i];
		b[i]=0;
		sa[i]=i;
	}
	
	bucket_sort(a);
	get_rank();
	
	for(int l=1;l<n;l<<=1) {
		for(int i=1;i<=n;i++) {
			a[i]=rnk[i];
			if(i+l<=n) {
				b[i]=rnk[i+l];
			}
			else {
				b[i]=0;
			}
		}
		
		bucket_sort(b);
		bucket_sort(a);
		get_rank();
	}
}

signed main() {
	freopen("temp.in","r",stdin);
	//freopen(".out","w",stdout);
	
	string s="";
	cin>>s;
	n=s.size();
	
	for(int i=0;i<n;i++) {
		w[i+1]=s[i];
		m=max(m,w[i+1]);
	}
	suffix_array();
	
	for(int i=1;i<=n;i++) {
		printf("%d ",sa[i]);
	}

	//fclose(stdin);
	//fclose(stdout);
	return 0;
}
2020/8/4 19:01
加载中...