Poj(1220),hash

时间:2024-12-02 08:36:44

题目链接:http://poj.org/problem?id=1200

这个题,我真是无限MLE,RE,WA,太伤心了,还是写一下吧。题意很简单(英语很好读),最后看了一下金海峰的思路。果然,应该是我的这个hash表有点问题,最好是用正确的算法吧,不乱创造了。karp-rabin把字符串转化成数字的算法,一个字符串有n种字符构成,把每种字符对应为0~n-1中的一个数字,把字母换成对应的数字之后,对于固定长度的串,每个串都与一个唯一的n进制数对应。这样就可以hash了。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; #define maxn 16000005 bool hash[maxn];
int name[];
int n, nc;
char st[maxn]; int main()
{
//freopen("t.txt", "r", stdin);
scanf("%d%d%s", &n, &nc, st);
memset(name, , sizeof(name));
memset(hash, , sizeof(hash));
int len = strlen(st);
int t =;
for (int i =; i < len; i++)
if (name[st[i]] ==)
name[st[i]] = t++;
int temp =;
t = nc;
for (int i =; i < n -; i++)
{
temp = temp * nc + name[st[i]];
t *= nc;
}
int ans =;
for (int i = n -; i < len; i++)
{
temp = (temp * nc + name[st[i]]) % t;
if (!hash[temp])
{
ans++;
hash[temp] =true;
}
}
printf("%d\n", ans);
return ;
}