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 ",ans); 54 } 55 56 return 0; 57 }