为什么我的SA一直TLE,大佬来看看

SA模板测试

这道题一直TLE

#include <bits/stdc++.h>
#define ll long long
#define pa pair<int,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define YES {puts("YES");return;}
#define NO {puts("NO");return ;}
using namespace std;
const int maxn=1e6+1011;
const int MOD=998244353;
const int inf=2147483647;
const double pi=acos(-1);
const double eps=1e-12;


ll read(){
    ll x=0,f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';
    return x*f;
}


struct SA{ 
	string ch;
	int n,M=30;
	int sa[maxn],rk[maxn],tp[maxn],tax[maxn],height[maxn];
	
	void Qsort(){					
		for(int i=0;i<=M;i++)tax[i]=0;
		for(int i=1;i<=n;i++)tax[rk[i]]++;
		for(int i=1;i<=M;i++)tax[i]+=tax[i-1];
		for(int i=n;i>=1;i--)sa[ tax[rk[tp[i]]]-- ]=tp[i];
		return ;
	}
	
	void get_sa(string s){
		ch=s;n=s.length();
		ch="!"+ch;
		for(int i=1;i<=n;i++)rk[i]=ch[i]-'a'+1,tp[i]=i;
		Qsort();
		for(int w=1,p=0;w<=n;w<<=1,M=p){
			p=0;
			for(int i=n-w+1;i<=n;i++)tp[++p]=i;
			for(int i=1;i<=n;i++)if(sa[i]>w)tp[++p]=sa[i]-w;
			Qsort();swap(tp,rk);rk[sa[1]]=p=1;
			for(int i=2;i<=n;i++){
				if(tp[sa[i-1]]==tp[sa[i]] && tp[sa[i-1]+w]==tp[sa[i]+w])rk[sa[i]]=p;
				else rk[sa[i]]=++p;
			}
			if(p==n)break;
		}
		return ;
	}
	
	void get_height(){
		for(int i=1;i<=n;i++)rk[sa[i]]=i;
		height[0]=0;
		for(int i=1,k=0;i<=n;i++){
			if(rk[i]==1)continue;
			if(k)k--;
			int j=sa[rk[i]-1];
			while(i+k<=n && j+k<=n && ch[i+k]==ch[j+k])k++;
			height[rk[i]]=k;
		}
		return ;
	}
	
}S;
void solve(){
	string s;cin>>s;
	S.get_sa(s);S.get_height();
	for(int i=1;i<=S.n;i++)printf("%d ",S.sa[i]);puts("");
	for(int i=1;i<=S.n;i++)printf("%d ",S.height[i]);puts("");
	return ;
}
int main(){
	int t=read();
	while(t--)solve();
	return 0;
}


``
全部评论

相关推荐

点赞 评论 收藏
分享
鬼迹人途:你去投一投尚游游戏,服务器一面,第一个图算法,做完了给你一个策略题,你给出方案他就提出低概率问题,答不上当场给你挂
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务