为什么相同代码自己交AC,你谷RMJ就TLE?
查看原帖
为什么相同代码自己交AC,你谷RMJ就TLE?
148552
我很低调楼主2022/11/14 22:40

洛谷:

SPOJ: 代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char S[1000000],str[1000000];
int n,nn,m;
int rk[1000000],sa[1000000],sa2[1000000],tax[1000000],height[1000000];
int pos[1000000],lst[1000000];
int Q[1000000],tm[1000000],frt,rer;
int tot[10];
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[sa2[i]]]--]=sa2[i];
}
void suffix(){
	m=30;
	for(int i=1;i<=n;i++)rk[i]=S[i]-'a'+2,sa2[i]=i;
	qsort();
	for(int j=1,cnt=0;j<n;m=cnt,j<<=1){
		cnt=0;
		for(int i=n-j+1;i<=n;i++)sa2[++cnt]=i;
		for(int i=1;i<=n;i++)if(sa[i]>=j+1)sa2[++cnt]=sa[i]-j;
		qsort();
		for(int i=0;i<=n;i++)sa2[i]=rk[i];
		rk[sa[1]]=1;cnt=1;
		for(int i=2;i<=n;i++){
			if(sa2[sa[i-1]]!=sa2[sa[i]]||sa2[sa[i-1]+j]!=sa2[sa[i]+j])cnt++;
			rk[sa[i]]=cnt;
		}
	}
}
void calheight(){
	int i,j,k=0;
	for(i=1;i<=n;height[rk[i++]]=k)
		for(k?k--:0,j=sa[rk[i]-1];S[i+k]==S[j+k];k++);
	return;
}
int chk(int len){
	int res=-1,sum=0;
	frt=1;rer=0;
	for(int i=1;i<=5;i++)tot[i]=0;
	tot[pos[sa[1]]]++;
	if(pos[sa[1]]>=1&&tot[pos[sa[1]]]==1)sum++;
	for(int i=2;i<=len;i++){
		tot[pos[sa[i]]]++;
		if(pos[sa[i]]>=1&&tot[pos[sa[i]]]==1)sum++;
		while(rer-frt>=0&&Q[rer]>=height[i])rer--;
		Q[++rer]=height[i];tm[rer]=i;
		if(sum==nn)res=max(res,Q[frt]);
	}
	for(int i=len+1;i<=n;i++){
		tot[pos[sa[i-len]]]--;
		if(pos[sa[i-len]]>=1&&tot[pos[sa[i-len]]]==0)sum--;
		while(rer-frt>=0&&i-len>=tm[frt]-1)frt++;

		tot[pos[sa[i]]]++;
		if(pos[sa[i]]>=1&&tot[pos[sa[i]]]==1)sum++;
		while(rer-frt>=0&&Q[rer]>=height[i])rer--;
		Q[++rer]=height[i];tm[rer]=i;

		if(sum==nn)res=max(res,Q[frt]);
	}
	return res;
}
int main(){//freopen("a.in","r",stdin);freopen("a.out","w",stdout);
	nn=2;
	for(int i=1;i<=nn;i++){
		scanf("%s\n",str+1);
		for(int j=1;j<=strlen(str+1);j++)S[++n]=str[j],pos[n]=i;
		S[++n]='a'-1;lst[n]=n;
	}
	for(int i=n;i>=1;i--)if(lst[i]==0)lst[i]=lst[i+1];
	suffix();
	calheight();
	for(int i=1;i<=n;i++)
		height[i]=min(height[i],min(lst[sa[i]]-sa[i],lst[sa[i-1]]-sa[i-1]));
	int ans=0;
	for(int i=2;i<=n;i++){
		if(pos[sa[i]]*pos[sa[i-1]]!=2)continue;
		ans=max(ans,height[i]);
	}
	printf("%d\n",ans);
	return 0;
}

求助大佬

2022/11/14 22:40
加载中...