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;
}

posted @ 2011-04-19 16:50  L..  阅读(669)  评论(0编辑  收藏  举报