Hash

Hash

一、Hash表

# include <bits/stdc++.h>
using namespace std;

const int MAXN=1e5+100;
const int mod=99991;
int tot=0;
int snow[MAXN][10],a[10];
int head[MAXN],nextt[MAXN],sum[10],mul[10];
int cal()
{
memset(sum,0,sizeof(sum));
memset(mul,1,sizeof(mul));
for(int i=1;i<=6;i++){
if(i==1) sum[i]=a[i]%mod,mul[i]=a[i]%mod;
else sum[i]=(sum[i-1]+a[i])%mod,mul[i]=(mul[i-1]*a[i])%mod;
}
return sum[6];
}
int same(int id)
{
int eq=1;
for(int k=1;k<=6;k++){
for(int i=1;i<=6;i++){
eq=1;
for(int j=1;j<=6;j++){
if(snow[id][(k+j)%6+1]!=a[(i+j)%6+1]) eq=0;
}
if(eq) return 1;
eq=1;
for(int j=1;j<=6;j++){
if(snow[id][(k+j)%6+1]!=a[(i+6-j)%6+1]) eq=0;
}
if(eq) return 1;
}
}

return 0;
}
int find()
{
int key=cal();
for(int i=head[key];i;i=nextt[i]){
if(same(i)) return 1;
}
tot++;
for(int i=1;i<=6;i++){
snow[tot][i]=a[i];
}
nextt[tot]=head[key],head[key]=tot;
return 0;
}
int main()
{
int n; scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=6;j++){
scanf("%d",&a[j]);
}
if(find()){
printf("Twin snowflakes found.\n");
return 0;
}
}
printf("No two snowflakes are alike.\n");
return 0;
}

二、字符串Hash

权重、前缀和处理和区间计算

# include <bits/stdc++.h>
using namespace std;

typedef unsigned long long ULL;
const int MAXN=1e6+100;
const int  base=131;
char s[MAXN];
ULL p[MAXN],f[MAXN];
int main()
{
scanf("%s",s+1);
int len=strlen(s+1);
p[0]=1;
for(int i=1;i<=len;i++){
p[i]=p[i-1]*base,f[i]=f[i-1]*base+s[i]-'a'+1;
}
int m; scanf("%d",&m);
for(int i=1;i<=m;i++){
int l1,r1,l2,r2; scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
ULL a,b;
a=f[r1]-f[l1-1]*p[r1-l1+1];
b=f[r2]-f[l2-1]*p[r2-l2+1];
if(a==b) printf("Yes\n");
else printf("No\n");
}
return 0;
}



posted @ 2022-02-27 13:50  fengzlj  阅读(69)  评论(0)    收藏  举报