小菜鸡 SA 求差错QAQ
查看原帖
小菜鸡 SA 求差错QAQ
35891
huangzirui楼主2020/7/24 21:23

RT 60 WA后四个点QAQ

#include <bits/stdc++.h>
#define ll long long
#define Mid ((L+R)>>1)
using namespace std;
typedef pair<int,int> pii;
inline int read(){
	char c;int x=0;int b=1;do{c=getchar();if(c==45)b=-1;}while(c>57||c<48);
	do x=x*10+c-48,c=getchar();while(c<=57&&c>=48);x*=b;return x;
}
const int maxn=20010;
int i,j,k,n,m,a[2*maxn],rank[maxn];
int nxt[maxn],id[maxn],S[maxn],S2[maxn],head[maxn],len,now[maxn],tmp[maxn],tmp2[maxn],len2,L;
int Rank[maxn];
void SA(){
	for(i=1;i<=n;i++)now[i]=a[i],id[i]=i;
	for(int Num=1;;Num*=2){
		for(i=1;i<=n;i++)if(i+Num<=n)tmp[i]=a[i+Num];
		for(i=1;i<=n;i++){
			S[++len]=now[i];
			S2[len]=id[i];
			nxt[len]=head[tmp[i]];
			head[tmp[i]]=len;
		}
		for(i=0;i<=n;i++){
			int X=head[i];
			while(X){
				now[++len2]=S[X];
				tmp[len2]=S2[X];
				tmp2[len2]=i;
				X=nxt[X];
			}
		}
		for(i=1;i<=len;i++)nxt[i]=S[i]=S2[i]=0;len=0;
		for(i=0;i<=n;i++)head[i]=0;
		for(i=len2;i>=1;i--){
			S[++len]=tmp[i];
			S2[len]=tmp2[i];
			nxt[len]=head[now[i]];
			head[now[i]]=len;
		}
		len2=0;
		L=0;
		for(i=0;i<=n;i++){
			int X=head[i],last=-1;
			while(X){
				if(S2[X]!=last)++L;
				last=S2[X];
				now[++len2]=L;
				id[len2]=S[X];
				X=nxt[X];
			}
		}
		for(i=1;i<=len;i++)nxt[i]=S[i]=S2[i]=0;len=0;
		for(i=0;i<=n;i++)head[i]=0;
		len2=0;
		if(L==n)break;
	}
	for(i=1;i<=n;i++)Rank[id[i]]=i;
}
int b[maxn],lth=1;
void got(int &x){
	int L=1,R=lth;
	while(1){
		if(b[Mid]==x){x=Mid;return;}
		if(b[Mid]>x)R=Mid-1;
		else L=Mid+1;
	}
}
int height[maxn];
void work(){
/*
	for(i=1;i<=n;i++)b[i]=a[i];
	sort(b+1,b+1+n);
	for(i=2;i<=n;i++)
		if(b[i]!=b[i-1])
			b[++lth]=b[i];
	for(i=1;i<=n;i++)got(a[i]);
*/
}
int Max[maxn][20],p[maxn];
int main() {
	freopen("P2852.in","r",stdin);
	freopen("P2852.out","w",stdout);
	cin>>n>>m;
	for(i=1;i<=n;i++)a[i]=read()+1;
	work();
	SA();
	for(i=1;i<n;i++){
		height[i]=max(height[i-1]-1,0);
		for(j=height[i];j<=n;j++){
			if(i+j<=n && a[i+j] == a[id[Rank[i]+1]+j])
				++height[i];
			else break;
		}
	}
	for(i=1;i<=n;i++)Max[i][0]=height[i];
	for(j=1;j<=19;j++)
		for(i=1;i<=n;i++)
			if(i+(1<<j-1)<=n)Max[i][j]=min(Max[i][j-1],Max[i+(1<<(j-1))-1][j-1]);
	for(i=2;i<=n;i++)p[i]=p[i/2]+1;
	int Ans=0;
	for(i=1;i<=n-m+1;i++){
		Ans=max(Ans,min(Max[i][p[m]],Max[(i+m-1)-(1<<p[m])+1][p[m]]));
	}
	cout<<Ans<<endl;
	//cerr << 1.0*clock()/CLOCKS_PER_SEC << endl;
	return 0;
}
2020/7/24 21:23
加载中...