题目:http://poj.org/problem?id=1200
一开始用set + strncmp,华丽丽的超时了,看了discuss之后才意识到要用hash
#include <cstdio>
#include <cstring>
#define MAX 16000000
int getPower(int n, int exp)
{
if(exp == 1) return n;
int t = getPower(n, exp >> 1);
if(exp & 1) return n * t * t;
else return t * t;
}
int N, NC, total, len, map[128];
char str[MAX + 1];
bool use[MAX + 1];
int getHash(int i){
int n = 0, k = 0;
for(; k < N; ++k){
n = n * NC + map[str[i + k]];
}
return n;
}
void solve()
{
int i, hash, kinds = 0;
for(i = 0; i + N <= len; ++i){
hash = getHash(i);
if(!use[hash]){
use[hash] = true;
++kinds;
if(kinds == total) break;
}
}
printf("%d\n", kinds);
}
void init()
{
total = getPower(NC, N);
len = strlen(str);
memset(use, false, total);
memset(map, -1, sizeof(map));
int kinds = 0, i = 0;
for(; kinds < NC; ++i){
if(map[str[i]] == -1){
map[str[i]] = kinds++;
}
}
}
inline void input(){
scanf("%d %d %s", &N, &NC, str);
}
int main()
{
input();
init();
solve();
return 0;
}