您的位置:首页 > 其它

POJ-1200(N进制字符串hash)

2014-08-14 17:05 357 查看
题目: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: