SA, 萌新求助!
查看原帖
SA, 萌新求助!
658786
STUDENT00楼主2022/12/22 16:58

萌新刚学SA,求助!

代码:

#include<bits/stdc++.h>
#define rank Rank
#define N 100005
using namespace std;
int T,n,m,k,a[N],SA[N],rank[N],tp[N],tax[N],Height[N],sum[N],mins[N][20],lg[N];
char str[N]; 
void RSort(){
	for(int i=0;i<=m;i++) tax[i]=0;
	for(int i=1;i<=n;i++) tax[rank[tp[i]]]++;
	for(int i=1;i<=m;i++) tax[i]+=tax[i-1];
	for(int i=n;i>=1;i--) SA[tax[rank[tp[i]]]--]=tp[i];
}
bool cmp(int *f,int x,int y,int w){return f[x]==f[y]&&f[x+w]==f[y+w];}
void Suffix(){
	for(int i=1;i<=n;i++){rank[i]=a[i];tp[i]=i;}
	m=127;RSort();
	int p=1;
	for(int w=1;p<n;w<<=1,m=p){
		int k=0;
		for(int i=n-w+1;i<=n;i++) tp[++k]=i;
		for(int i=1;i<=n;i++){if(SA[i]>w) tp[++k]=SA[i]-w;}
		RSort();swap(tp,rank);rank[SA[1]]=p=1;
		for(int i=2;i<=n;i++) rank[SA[i]]=cmp(tp,SA[i],SA[i-1],w)?p:++p;
	}
	p=0;
	for(int i=1;i<=n;Height[rank[i++]]=p){
		p=p?p-1:p;
		for(int j=SA[rank[i]-1];a[i+p]==a[j+p];p++);
	}
}
void ST(){
	for(int i=1;i<=n;i++) mins[i][0]=Height[i];
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i+(1<<j)-1<=n;i++) mins[i][j]=min(mins[i][j-1],mins[i+(1<<j-1)][j-1]);
	}
}
int lcp(int l,int r){
	return min(mins[l][lg[r-l+1]],mins[r-(1<<lg[r-l+1])+1][lg[r-l+1]]);
}
int work(){
	k--;
	for(int i=1;i<=n-k+1;i++){
		int l=max(Height[i-1],Height[i+k]),r=lcp(i,i+k-1);
		if(l<r){sum[l+1]++;sum[r+1]--;}
	}
}
int work1(){
	for(int i=1;i<=n;i++){
		int l=max(Height[i],Height[i+1]),r=n-SA[i]+1;
		if(l<r){sum[l+1]++;sum[r+1]--;}
	}
}
int main(){
	lg[0]=-1;
	for(int i=1;i<N;i++) lg[i]=lg[i>>1LL]+1;
	scanf("%d",&T);
	while(T--){
		scanf("%s%d",str,&k);
		n=strlen(str);
		for(int i=1;i<=n;i++) a[i]=str[i-1];
		Suffix();
		ST();
		memset(sum,0,sizeof(sum));
		if(k==1) work1();
		else work();
		for(int i=1;i<=n;i++) sum[i]+=sum[i-1];
		int maxs=0,ans=-1;
		for(int i=1;i<=n;i++){
			if(sum[i]&&sum[i]>=maxs){maxs=sum[i];ans=i;}
		}
		printf("%d\n",ans);
	}
	return 0;
}
2022/12/22 16:58
加载中...