这是我看第一篇题解写的
#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,也是为了保险吗?