Match & Catch

Match & Catch

关键

哈希表进行处理,手写map进行快速配对

代码

#include <bits/stdc++.h>
using namespace std;
using ull=unsigned long long;
const int M=5005;
const ull P=131,mod=13331;
char s1[M],s2[M];
ull num1[M],num2[M],base[M];
void init() {
base[0]=1;//这里需要初始化
int n=strlen(s1+1),m=strlen(s2+1);
for(int i=1;i<=max(n,m);i++)base[i]=base[i-1]*P;
for(int i=1;i<=n;i++)num1[i]=num1[i-1]*P+s1[i];
for(int i=1;i<=m;i++)num2[i]=num2[i-1]*P+s2[i];
}
ull query(ull *num,int l,int r) {
return num[r]-num[l-1]*base[r-l+1];
}
int h[mod],ne[M<<1],e[M<<1],num[M<<1][2],tot;
ull v[M<<1];
void insert(ull val,bool t) {
int x=val%mod;
for(int i=h[x];i;i=ne[i])
if(v[i]==val){num[i][t]++;return ;}
v[++tot]=val;
num[tot][t]++;//记录这个点
ne[tot]=h[x];
h[x]=tot;//邻接表
}
void init_hash() {
memset(h,0,sizeof(h));
for(int i=1;i<=tot;i++)
num[i][0]=num[i][1]=0;
tot=0;
}
bool check() {
for(int i=1;i<=tot;i++)
if(num[i][0]==num[i][1]&&num[i][0]==1)return 1;
return 0;
}
int main() {
scanf("%s",s1+1);
scanf("%s",s2+1);
init();
int n=strlen(s1+1),m=strlen(s2+1);
for(int len=1;len<=min(n,m);len++) {
init_hash();
for(int i=1;i+len-1<=n;i++)insert(query(num1,i,i+len-1),0);
for(int i=1;i+len-1<=m;i++)insert(query(num2,i,i+len-1),1);
if(check())return cout<<len,0;
}
cout<<-1;
return 0;
}
posted @   basicecho  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示