POJ 1200 Crazy Search
题意
给定一个由NC个字母组成的字符串,求长度为N的不同子串的个数
思路:
由于只有NC个字母,可以将字母编号,0 ~ NC - 1,转换成数字,就可以将字符串表示成NC进制的数字,这样所有字串代表的数字都是唯一的,转换成10进制的数也是唯一的!
就像10的二进制表示只有1010
例如
3 4 daababac
d = 3
a = 0
b = 1
c = 2
daa = 3 * 4 ^ 2 + 0 * 4 ^ 1 + 0 * 4 ^ 0 = 48
#include <stdio.h>
#include <string.h>
char str[1000000];
bool hash[16000000] = {false};
int ansi[256] = {0};
int main(){
int N, NC, ans = 0;
scanf("%d%d%s",&N, &NC, str);
for(char *s = str; *s; ++s){ //*s 不是 s
ansi[*s] = 1; //如果字母出现过,赋值为1
}
int cnt = 0;
for(int i = 0; i < 256; ++i){
if(ansi[i])
ansi[i] = cnt++; //从0开始编号
}
int len = strlen(str);
for(int i = 0; i < len - N + 1; ++i){
int key = 0;
for(int j = 0; j < N; ++j){
key = key * NC + ansi[str[i + j]]; //转换成NC进制
//printf("%d\n",ansi[str[i + j]]);
}
//printf("key=%d\n",key);
if( !hash[key] ){
ans++;
hash[key] = true;
}
}
printf("%d\n",ans);
return 0;
}