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

你可能感兴趣的:(search)