POJ-1200(哈希)

2015-08-19

题意:给出两个数n,nc,并给出一个由nc种字符组成的字符串。求这个字符串中长度为n的子串有多少种。
分析:
1.这个题不用匹配,因为不高效。
2.将长度为n的子串看作n位的nc进制数,将问题转化为共有多少种十进制数字。
3.哈希时,每一个字符都对应这0---nc-1的一个数字。
代码:
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<map>
 6 using namespace std;
 7 const int maxn = 16e6;
 8 
 9 char s[maxn];
10 unsigned int Hash[maxn];
11 int n,m;
12 int name[1000];
13 
14 unsigned int hash(char *str,int x)
15 {
16     unsigned int ans = 0;
17     for(int i = 0; i < x; ++i)
18     {
19         ans=ans*m +name[*(str+i)];
20     }
21     return ans;
22 }
23 
24 int main()
25 {
26     //freopen("in","r",stdin);
27     while(~scanf("%d%d",&n,&m))
28     {
29         scanf("%s",s);
30         int len = strlen(s),k = 0;
31         for(int i = 0; i < len; ++i)
32         {
33             if(name[s[i]] == 0) name[s[i]] = k++;
34         }
35         for(int i = 0; i <= len - n; ++i)
36         {
37             unsigned int ID = hash(s+i,n);
38             Hash[ID] = 1;
39         }
40         int ans = 0;
41         for(int i = 0; i < maxn; ++i)
42             ans += Hash[i];
43         printf("%d\n",ans);
44     }
45 }
View Code

 

posted @ 2015-08-19 20:25  Norlan  阅读(245)  评论(0编辑  收藏  举报