经过几个小时的不懈尝试,我们用哈希卡过了以下三题:
求时间复杂度分析,第一题代码如下:
//+火车头
#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;
}