1 条题解
-
0
哈希的过程,其实可以看作对一个串的单向加密过程,并且需要保证所加的密不能冲突(就像不能让隔壁老王轻易地用它家的钥匙打开你家门一样QWQ)
不过有的题确实会卡哈希冲突主要思路是选取恰当的进制,可以把字符串中的字符看成一个大数字中的每一位数字,不过比较字符串和比较大数字的复杂度并没有什么区别(高精数的比较也是O(n)的),但只要把它对一个数取模,然后认为取模后的结果相等原数就相等,那么就可以在一定的错误率的基础上O(1)进行判断了。 关于进制的选择实际上非常自由,大于所有字符对应的数字的最大值,不要含有模数的质因子(那还取什么模),比如一个字符集是a到z的题目,选择27、233都是可以的。
这里用的就是常见的进制哈希
#include<algorithm> #include<iostream> #include<string> using namespace std; int n; const long long mod=1e9+911;//取模的大质数 const int base=233;//进制位 long long ha(string a){ long long ans=0; for(int i=0; i<a.length(); i++){ ans=(ans*base+a[i])%mod;//标准的字符哈希 } return ans; } string s; long long k[150000]; int main(){ cin>>n; for(int i=0; i<n; i++){ cin>>s; k[i]=ha(s); } sort(k,k+n);//答案排序 int ans=0; for(int i=0; i<n; i++){ if(k[i]!=k[i+1])ans++;//答案累加 } cout<<ans; return 0; }
- 1
信息
- ID
- 2306
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 2
- 标签
- 递交数
- 39
- 已通过
- 17
- 上传者