POJ_1200_Crazy Search
集合最多为1600的字符串,hash了N个进制
//hash基础题, 转化为 nc进制 #include <stdio.h> #include <string.h> #define MAX 1600000 char s[MAX]; int Hash[MAX*10]={0},a[130]; int main() { int i,j,h,sum,n,nc,num,len; scanf("%d%d%s",&n,&nc,s); memset(a,-1,sizeof(a)); len=strlen(s); for(i=0;i<len;++i) if(a[s[i]]==-1) a[s[i]]=1; for(i='a',num=0;i<='z';++i) if(a[i]!=-1) a[i]=num++; for(i=0,sum=0;s[i+n-1]!=0;++i) { h=0; for(j=i;j<i+n;++j) h=h*nc+a[s[j]]; if(!Hash[h]) { Hash[h]=1; sum++; } } printf("%d\n",sum); return 0; }