字符串哈希WA18pts求助玄关
查看原帖
字符串哈希WA18pts求助玄关
511811
崛起的滑稽楼主2024/10/5 13:44

提交记录 其中#1RE

#include <bits/stdc++.h>
#define int int64_t
//#define int __int128
//#define MOD (1000000007)
//#define eps (1e-6)
#define endl '\n'
#define debug_endl cout<<endl;
#define debug cout<<"debug"<<endl;
const int MOD=0x0d000721;
const int base=0721;
using namespace std;
const int MAXN=2010;
int n,ans;
string s[6];
int p[MAXN];
int mod(int a,int p){
	return (a%p+p)%p;
}
int getHash(int idx,int l,int r){
	int h=0;
	for(int i=l;i<r;++i){
		h=mod((h+int(s[idx][i]-'a'+1)*p[r-i-1]),MOD);
	}
	//cout<<h<<endl;
	return h;
}
bool checkString(int idx,int h,int len){
	int h2=getHash(idx,0,len);
	if(h==h2){
		return true;
	}
	for(int i=1;i<s[idx].size()-len+1;++i){
		h2=mod(h2-mod(int(s[idx][i-1]-'a'+1)*p[len-1],MOD),MOD);
		h2=mod(h2*base+int(s[idx][i+len-1]-'a'+1),MOD);
		if(h2==h){
			return true;
		}
	}
	return false;
}
bool check(int l){
	for(int k=0;k<s[1].size()-l+1;++k){
		int h=getHash(1,k,k+l);
		for(int i=2;i<=n;++i){
			if(!checkString(i,h,l)){
				return false;
			}
		}
	}
	
	return true;
}
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>s[i];
	}
	sort(s+1,s+n+1);
	p[0]=1;
	for(int i=1;i<s[n].size();++i){
		p[i]=(p[i-1]*base)%MOD;
	}
	int r=s[1].size(),l=1;
	while(l<=r){
		int mid=(l+r)>>1;
		if(check(mid)){
			ans=mid;
			l=mid+1;
		}
		else{
			r=mid-1;
		}
	}
	cout<<ans;
	return 0;
}
2024/10/5 13:44
加载中...