POJ 1200 Crazy Search 【hash】

<题目链接>

题目大意:

给定n,nc,和一个字符串,该字符串由nc种字符组成,现在要你寻找该字符串中长度为n的子字符串有多少种。

解题分析:

因为要判重,所以讲这些字符串hash一下,将不同的字符串映射为数字,这里我们是将该字符串转化为nc进制数,不同的字符串分别对应nc进制下不同的数。

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 const int M =16e6+10;
 5 char str[M];
 6 bool hash[M];
 7 int cur[256];
 8 
 9 int main(){
10     int n,nc;
11     while(scanf("%d%d%s",&n,&nc,str)!=EOF){
12         int cnt=0;
13         memset(cur,0,sizeof(cur));
14         memset(hash,false,sizeof(hash));
15         int len=strlen(str);
16         for(int i=0;i<len;i++){    //给所有字符都分配编号 
17             if(!cur[str[i]])   
18                 cur[str[i]]=++cnt;
19             if(cnt==nc)break;
20         }
21         int ans=0;
22         for(int i=0;i+n-1<len;i++){
23             int sum=0;
24             for(int j=i;j<i+n;j++){
25                 sum+=sum*nc+cur[str[j]];   //得到该字符串转化为nc进制数的值 
26             }
27             if(!hash[sum]){
28                 ++ans;
29                 hash[sum]=true;
30             }
31         }
32         printf("%d
",ans);
33     }
34     return 0;
35 }

2018-10-30