关于哈希
查看原帖
关于哈希
315205
Kniqht楼主2022/9/11 15:33

这是我看第一篇题解写的

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=3010;
const ll mod=1000000000000037,M=114514;
int n,cnt;
char s1[N],s2[N];
ll s,num[N*N];
int main(){
    scanf("%d%s%s",&n,s1+1,s2+1);
    for(int i=1;i<=n;i++){
        s=0;int tmp=1;
        for(int j=i;j<=n;j++){
            while(tmp<=n&&s1[tmp]!=s2[j]) tmp++;
            if(tmp>n) break;
            tmp++;
            s=(s*(ll)j*M+s2[j])%mod;
            num[++cnt]=s;
        }
    }
    sort(num+1,num+cnt+1);
    printf("%d",unique(num+1,num+cnt+1)-num-1);
    return 0;
}

然后他就0pts

但是我把代码改成这样

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=3010;
const ll mod=1000000000000037,M=114514;
int n,cnt;
char s1[N],s2[N];
ll s,num[N*N];
int main(){
    scanf("%d%s%s",&n,s1+1,s2+1);
    for(int i=1;i<=n;i++){
        s=0;int tmp=1;
        for(int j=i;j<=n;j++){
            while(tmp<=n&&s1[tmp]!=s2[j]) tmp++;
            if(tmp>n) break;
            tmp++;
            s=(s*M+s2[j])%mod;//这块中间删除了一个乘以(ll)j
            num[++cnt]=s;
        }
    }
    sort(num+1,num+cnt+1);
    printf("%d",unique(num+1,num+cnt+1)-num-1);
    return 0;
}

区别在注释里面 就90pts 1TLE了(开个O2应该1能过)

那这是为什么呢?我多加了个j觉得多乘一个保险一点,结果就炸了

另外问一下,这种字符串哈希,模数就取一个大质数就行吗?然后第一篇题解大佬又乘上了一个BASE,也是为了保险吗?

2022/9/11 15:33
加载中...