poj1200_经典hash
题意:给出两个数n,nc,并给出一个由nc种字符组成的字符串。求这个字符串中长度为n的子串有多少种。
分析:
1.这个题不用匹配,因为不高效。
2.将长度为n的子串看作n位的nc进制数,将问题转化为共有多少种十进制数字。
3.哈希时,每一个字符都对应这0---nc-1的一个数字。
代码:
View Code
1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 const int maxnum=1600000; 6 char str[maxnum]; 7 bool array[20000000]; 8 int hash[256]; 9 10 int main() 11 { 12 int n,nc; 13 int i,cnt,len,sum,j,res; 14 while(scanf("%d%d%s",&n,&nc,str)!=EOF) 15 { 16 cnt=0; 17 memset(hash,0,sizeof(hash)); 18 memset(array,false,sizeof(array)); 19 len=strlen(str); 20 for(i=0;i<len;i++) 21 if(hash[str[i]]==0) //cnt最大为nc-1 22 hash[str[i]]=cnt++; 23 res=0; 24 for(i=0;i+n<=len;i++) 25 { 26 sum=0; 27 for(j=i;j<i+n;j++) 28 { 29 sum*=nc; //将长度为n的子串看作是n位nc进制数,这里求的是这个n为nc进制数的对应的十进制数。 30 sum+=hash[str[j]]; 31 } 32 if(!array[sum]) 33 { 34 res++; 35 array[sum]=true; 36 } 37 } 38 printf("%d\n",res); 39 } 40 return 0; 41 }
tju oj1663