裸哈希,感觉oj的数据弱啊,如果N很大的话,内存就不够用,可能我没想明白?
#include <stdio.h> #include <string.h> const int maxn=16000010; char s[maxn]; int li[300]; short hash[maxn]; int tot; int main() { int N,NC; scanf("%d%d",&N,&NC); scanf("%s",s); int sl=strlen(s); int t=1,i,j; memset(hash,0,sizeof(hash)); memset(li,0,sizeof(li)); for(i=0;i<sl;i++) { if(!li[s[i]]) li[s[i]]=t++;//t只能从1开始 } int sum; for(i=0;i<=sl-N;i++) { sum=0; for(j=i;j<i+N;j++) { sum=sum*NC+li[s[j]];//决定了只能从1开始,如果t为0,会出现不是同一串却有相同的hash值,而且要记住这个哈希函数,只要散列表足够大,这个哈希函数就不会产生冲突 } if(!hash[sum]) { hash[sum]=1; tot++; } } printf("%d\n",tot); return 0; }