poj 1200 crasy search

https://vjudge.net/problem/POJ-1200

题意:

给出一个字符串,给出子串的长度n和给出的字符串中不同字符的个数nc,统计这个字符串一共有多少不同的长度为n的子串。

思路:

太菜了,还是看着题解做的。最开始根本不知道nc有何用。。。既然最多只有nc个不同的字符,那么就可以把每一个子串转化为一个nc进制的数,然后再把这个数转化为10进制数,之后统计一共有多少个不同的10进制数就可以了啊。

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 const int maxn = 16000005;
 5 
 6 bool vis[maxn];
 7 int a[400];
 8 char s[maxn];
 9 
10 int main()
11 {
12     int n,nc;
13 
14     while (scanf("%d%d%s",&n,&nc,s) != EOF)
15     {
16         memset(vis,0,sizeof(vis));
17         memset(a,0,sizeof(a));
18 
19         int len = strlen(s);
20 
21         int sum = 0;
22 
23         for (int i = 0;i <= len;i++)
24         {
25             char c = s[i];
26 
27             if (!a[c])
28             {
29                 a[c] = ++sum;
30             }
31         }
32 
33         int ans = 0;
34 
35         for (int i = 0;i <= len - n;i++)
36         {
37             int num = 0;
38 
39             for (int j = 0;j < n;j++)
40             {
41                 char c = s[i+j];
42 
43                 num  = num * nc + (a[c] - 1);
44             }
45 
46             if (!vis[num])
47             {
48                 vis[num] = 1;
49                 ans++;
50             }
51         }
52 
53         printf("%d\n",ans);
54     }
55 
56     return 0;
57 }

 

posted @ 2017-07-26 09:30  qrfkickit  阅读(109)  评论(0编辑  收藏  举报