poj1200

这题用hash做。算法导论上面讲的很清楚

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 char s[16000005];
 5 int a[100000];
 6 int hash[16000005];
 7 int main()
 8 {
 9     int n,nc;
10 
11     memset(hash,0,sizeof(hash));
12     memset(a,0,sizeof(a));
13     scanf("%d %d ",&n,&nc);
14     scanf("%s",s);
15     int sum=0;
16     int count=0;
17     int len=strlen(s);
18     for(int i=0;i<len;i++)
19     {
20         if(a[s[i]]==0)
21         a[s[i]]=++count;
22     }
23     int ans=0;
24     for(int i=0;i<len-n+1;i++)
25     {
26         //int mod=1;
27         sum=0;
28         for(int j=i;j<i+n;j++)
29         {
30             sum=sum*nc+a[s[j]];
31         }
32         //sum=sum%mod;
33         if(hash[sum]==0)
34         {
35             ans++;
36             hash[sum]=1;
37         }
38     }
39     printf("%d\n",ans);
40     return 0;
41 }

posted on 2012-08-23 10:05  矮人狙击手!  阅读(217)  评论(0编辑  收藏  举报

导航