MnZn刚学SARE求条
查看原帖
MnZn刚学SARE求条
539133
q1uple楼主2024/9/7 09:38

/kel,有人给个hack也行

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,mod=1e9+7,INF=2e9;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
#define qmi(a,b) a=min(a,b)
#define qma(a,b) a=max(a,b)
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define atrep(i,l,r) for(int i=(r);i>=(l);i--)
#define vec vector<int>
#define pb push_back
char s[N];
int sa[N],rnk[N],tp[N],tax[N],n,M;
void qsort(){
	rep(i,0,M)	tax[i]=0;
	rep(i,1,n)	tax[rnk[i]]++;
	rep(i,0,M)	tax[i]+=tax[i-1];
	atrep(i,1,n)	sa[tax[rnk[tp[i]]]--]=tp[i];
}
void get_sa(){
	M=2005;
	rep(i,1,n)	tp[i]=i,rnk[i]=s[i]-'a';
	qsort();
	for(int w=1,p=0;w<=n;M=p,w<<=1){
		p=0;
		rep(i,1,w)	tp[++p]=n-w+i;
		rep(i,1,n)	if(sa[i]>w)	tp[++p]=sa[i]-w;
		qsort();
		swap(tp,rnk);
		rnk[sa[1]]=p=1;
		rep(i,2,n)	rnk[sa[i]]=(tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+w]==tp[sa[i-1]+w])?p:++p;
	}
}
int he[N];
void get_height(){
	int k=0;
	rep(i,1,n){
		if(k)	k--;
		int j=sa[rnk[i]-1];
		while(i+k<=n&&j+k<=n&&s[i+k]==s[j+k])	k++;
		he[rnk[i]]=k;
	}
}
int st[N][23];
void stable(){
	for(int i=1;i<=n;i++)   st[i][0]=he[i];
    for(int j=1;j<=20;j++){
        for(int i=1;i+(1<<j)-1<=n;i++){
            st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
        }
    }
}
int query(int l,int r){
	if(l>r)	swap(l,r);
	int k=(int)log2(r- ++l+1);
    return min(st[l][k],st[r-(1<<k)+1][k]);
}
void init(){
	memset(sa,0,sizeof sa);
	memset(rnk,0,sizeof rnk);
	memset(he,0,sizeof he);
	memset(st,0,sizeof st);
	memset(tax,0,sizeof tax);

}
void solve(){
	init();
	cin>>n;
	rep(i,1,n){
		char tmp[3];
		scanf("%s",tmp);
		s[i]=tmp[0];
	}
	get_sa();
	get_height();
	stable();
	int ans=1;
	int lqaq=0,rqaq=0;
	rep(len,1,n){
		for(int i=1;i+len<=n;i+=len){
			int k=query(rnk[i],rnk[i+len]),res=k/len+1;
			int l=i-(len-k%len);
			if(l>0) res+=k>len;
			if(res>ans){
				ans=res;
			}
		}
	}
	cout<<ans<<"\n";
}
int main(){
	int T;
	cin>>T;
	while(T--)	solve();
}
2024/9/7 09:38
加载中...