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 @ 2023-01-13 19:47  basicecho  阅读(52)  评论(0)    收藏  举报