F02【模板】字符串哈希
题目:给定一个字符串,多次询问两个区间的子串是否相同
把字符串的所有前缀映射为多项式整数(哈希值),由哈希式的前缀和求区间和
// 字符串哈希 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; }
题目:求 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; }
// 字符串哈希 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
20241116_字符串/哈希 - 题单 - 洛谷 | 计算机科学教育新生态
浙公网安备 33010602011771号