传奇哈希法
  • 板块学术版
  • 楼主Jadonyzx
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/1/20 20:21
  • 上次更新2025/1/21 07:29:27
查看原帖
传奇哈希法
1164775
Jadonyzx楼主2025/1/20 20:21

经过几个小时的不懈尝试,我们用哈希卡过了以下三题:

1

2

3

求时间复杂度分析,第一题代码如下:

//+火车头
#include<bits/stdc++.h>
#include<bits/extc++.h>
#define maxn 3
#define ull unsigned long long
using namespace std;
const int base=31;
int length_[maxn],n;char b[1000005];
ull mul[1000005],pre[maxn][1000005];
ull query1(int id,int l,int r){return (pre[id][r]-pre[id][l-1]*mul[r+1-l]);}
__gnu_pbds::gp_hash_table<ull,bool>vis[maxn][3];
inline bool check(int len){
	for(int i=2;i<=n;++i)vis[i][0].clear();
	for(int i=2;i<=n;++i)for(int j=1;j+len-1<=length_[i];++j)vis[i][0][query1(i,j,j+len-1)]=1;
	for(int i=1;i+len-1<=length_[1];++i){
		ull noi1=query1(1,i,i+len-1);bool f=1;
		for(int j=2;j<=n;++j){
			if(!(vis[j][0][noi1])){
				f=0;
				break;
			}
		}
		if(f)return 1;
	}
	return 0;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	mul[0]=1;int L=1,R=INT_MAX,ans=0,i=1;
	while(cin>>(b+1)){
		length_[i]=strlen(b+1);
		for(int j=1;j<=length_[i];++j)pre[i][j]=(pre[i][j-1]*base+b[j]-'a'+1);
		R=min(R,length_[i]);n=i;i++;
	}
	for(int i=1;i<=500000;++i)mul[i]=mul[i-1]*base;
	while(L<=R){
		int mid=L+R;mid>>=1;
		if(check(mid))L=mid+1,ans=mid;
		else R=mid-1;
	}
	cout<<ans;
	return 0;
}
2025/1/20 20:21
加载中...