然而这个题,单哈希也能过,数据应该加强。
事实上常用的哈希函数也就那么几个。编码效率和运行效果最好的大概就是BKDRHash算法了。
对于BKDRHash,如果有冲突就换一个种子就好了。可以有131,13131等各种各样奇怪的种子(都不保险,正统的解决方案是写个链表或者后移)。
#include<cstdio>
#include<algorithm>
using namespace std;
char ch[10000];int n,cnt;
unsigned int a[10000];
inline unsigned int BKDRHash(char *str)
{
unsigned int seed = 131;
unsigned int hash = 0;
while (*str)
hash = hash * seed + (*str++);
return (hash & 0x7FFFFFFF);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",ch);
a[i]=BKDRHash(ch);
}
sort(a,a+n);
for(int i=0;i<n;i++)
if(a[i]!=a[i+1])
cnt++;
printf("%d",cnt);
return 0;
}
蒟蒻渣渣代码。判重写的非常丑。
友情提示:对于Hash函数,建议加上inline提高效率,会有意想不到的效率提升(~1200ms->~200ms)
对于大数据,请善用scanf与printf。
就酱。