https://codeforces.com/problemset/problem/4/C
用来哈希的一道题目,用map也可以强行过,但是性能慢了6倍,说明是在字符串比较的时候花费了接近6倍的时间。
假如时间性能允许的话不妨用map存hash值,这样就可以让他自然溢出了。基数我喜欢选23333,溢出选择ll自然溢出(反正是map存的可以是负的)
自带hash型map,也是慢到感人。
#include<bits/stdc++.h> using namespace std; int n; string s; unordered_map<string,int>m; int main(){ scanf("%d",&n); while(n--){ cin>>s; m[s]++; if(m[s]==1) printf("OK "); else printf("%s%d ",s.c_str(),m[s]-1); } }
自写传说中(不满足递推的但是分布很不错的)DJB哈希,时间性能非常不错。
#include<bits/stdc++.h> using namespace std; #define ll long long int n; char s[40]; map<ll,int> m; ll DJBhash(){ ll hash=5381; int l=strlen(s); for(int i=0;i<l;i++){ hash=((hash<<5)+hash)+s[i]; } return hash; } int main(){ scanf("%d",&n); while(n--){ scanf("%s",s); ll res=DJBhash(); int t=m[res]++; if(t==0) printf("OK "); else printf("%s%d ",s,t); } }