F02【模板】字符串哈希

F02 字符串哈希_哔哩哔哩_bilibili

 

U417226 字符串哈希 - 洛谷

题目:给定一个字符串,多次询问两个区间的子串是否相同

把字符串的所有前缀映射为多项式整数(哈希值),由哈希式的前缀和求区间和

// 字符串哈希 O(n)
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;

const int N=1000010,B=131;
int n,m;
char s[N];
ull f[N],p[N];

ull get(int l,int r){ //区间哈希值
  return f[r]-f[l-1]*p[r-l+1]; //f[r]-f[l-1]*B^(r-l+1)
}
int main(){
  cin>>n>>m;
  scanf("%s",s+1);
  
  f[0]=0,p[0]=1;
  for(int i=1; i<=n; i++){
    f[i]=f[i-1]*B+s[i]; //f[abcde]=a*B^4+b*B^3+c*B^2+d*B^1+e
    p[i]=p[i-1]*B;      //p[i]=B^i
  }
  
  while(m--){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    if(get(a,b)==get(c,d)) puts("Yes");
    else puts("No");
  }
  return 0;
}

 

P3370 【模板】字符串哈希 - 洛谷

题目:求 N 个字符串中共有多少个不同的字符串

把每个字符串映射为哈希式的值,存下来排序去重

// 字符串哈希 O(nm)
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;

const int N=10010,B=131;
int n;
char s[N];
ull h[N];

ull get(char *s){ //s的哈希值
  int m=strlen(s+1);
  ull f=0;
  for(int i=1;i<=m;i++) f=f*B+s[i];
  return f;
}
int main(){
  cin>>n;
  for(int i=1; i<=n; i++){
    scanf("%s",s+1);
    h[i]=get(s);
  }
  
  sort(h+1,h+n+1);
  int cnt=unique(h+1,h+n+1)-h-1;
  cout<<cnt;
  return 0;
}

 

U461211 字符串 Hash(数据加强) - 洛谷

// 字符串哈希 O(nm)
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;

const int N=1000010;
ull B=131,M=1e9+7;
int n;
char s[N];
ull h[N];

ull get(char *s){
  int m=strlen(s+1);
  ull f=0;
  for(int i=1; i<=m; i++) f=(f*B+s[i])%M;
  for(int i=1; i<=m; i++) f=(f*B+s[i]);
  return f;
}
int main(){
  cin>>n;
  for(int i=1; i<=n; i++){
    scanf("%s",s+1);
    h[i]=get(s);
  }
  
  sort(h+1,h+n+1);
  int cnt=unique(h+1,h+n+1)-h-1;
  cout<<cnt;
  return 0;
}

 

字符串哈希 - OI Wiki

万能的字符串 Hash - 洛谷专栏

字符串哈希 - 洛谷专栏

「题单题解」字符串 Hash - 洛谷专栏

U577837 字符串哈希详解 - 洛谷

 

P1481 魔族密码 - 洛谷

P7114 [NOIP2020] 字符串匹配 - 洛谷

字符串哈希 - 题单 - 洛谷 | 计算机科学教育新生态

20241116_字符串/哈希 - 题单 - 洛谷 | 计算机科学教育新生态

 

posted @ 2022-04-13 19:21  董晓  阅读(2143)  评论(3)    收藏  举报