1 条题解
-
0
单哈希
#include<bits/stdc++.h> using namespace std; int n; string s[10005]; const int BASE = 31; const int MOD = 1000000007; int hash1[10005]; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>s[i]; //生成每个字符串的哈希值 for(int i=1;i<=n;i++){ //s[i] -> hash[i] hash1[i] = 0; for(int j=0;j<s[i].size();j++) hash1[i] = (hash1[i]*BASE+s[i][j])%MOD; } //暴力比较 int ans = 0; for(int i=1;i<=n;i++) { bool flag = true;//初始认为 s[i] 没有出现过 for(int j=1;j<i;j++) { if(hash1[i]==hash1[j]) { flag=false; break; } } if(flag) ans++; } cout<<ans<<"\n"; return 0; }
自然溢出哈希
#include<bits/stdc++.h> using namespace std; int n; string s[10005]; const int BASE = 31; unsigned long long hash1[10005]; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>s[i]; //生成每个字符串的哈希值 for(int i=1;i<=n;i++){ //s[i] -> hash[i] hash1[i] = 0; for(int j=0;j<s[i].size();j++) hash1[i] = hash1[i]*BASE+s[i][j]; } //暴力比较 int ans = 0; for(int i=1;i<=n;i++) { bool flag = true;//初始认为 s[i] 没有出现过 for(int j=1;j<i;j++) { if(hash1[i]==hash1[j]) { flag=false; break; } } if(flag) ans++; } cout<<ans<<"\n"; return 0; }
双哈希
#include<bits/stdc++.h> #define int long long using namespace std; int n; string s[10005]; const int P1 = 31; const int MOD1 = 1000000007; int hash1[10005]; const int P2 = 29; const int MOD2 = 998244353; int hash2[10005]; signed main() { cin>>n; for(int i=1;i<=n;i++) cin>>s[i]; //生成每个字符串的哈希值 for(int i=1;i<=n;i++){ //s[i] -> hash[i] hash1[i] = 0; hash2[i] = 0; for(int j=0;j<s[i].size();j++) { hash1[i] = (hash1[i] * P1 + s[i][j])%MOD1; hash2[i] = (hash2[i] * P2 + s[i][j])%MOD2; } } //暴力比较 int ans = 0; for(int i=1;i<=n;i++) { bool flag = true;//初始认为 s[i] 没有出现过 for(int j=1;j<i;j++) { if(hash1[i]==hash1[j]&&hash2[i]==hash2[j]) { flag=false; break; } } if(flag) ans++; } cout<<ans<<"\n"; return 0; }
- 1
信息
- ID
- 1355
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 2
- 标签
- 递交数
- 41
- 已通过
- 16
- 上传者