您的位置:首页 > 其它

POJ 1200Crazy Search解题报告

2013-03-06 21:10 393 查看
字符串哈希的入门题目,字符串哈希算法,大部分用的其实是进制表示,通过转换成不同进制的整数来表示一个字符串,因为计算机存储整数是有最大限度的,所以按照这种方法进行字符串哈希得到的整数有可能会越界,越界处理之后产生的结果,就是可能会造成冲突:两个字符串的值会相同,这道题不用考虑那么多,不过因为字符串太长,所以要对一个数取模,最多出现NC个不同的字符,可以像整数一样利用NC进制来表示,参照二进制的数值表示也能知道,要对NC^N取模

View Code

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define LEN 17000000
bool val[LEN];
char s[LEN];
int use[300];
int main()
{
int i,j,N,NC,len;
int mod;
while(scanf("%d%d",&N,&NC)!=EOF)
{
memset(val,0,sizeof(val));
memset(use,0,sizeof(use));
scanf("%s",s);
len = strlen(s);
int res = 0;
for(i = 0;i < len;i++)
use[s[i]] = 1;
j = 0;
for(i = 0;i < 300;i++)
if(use[i])
use[i] = j++;
mod = 1;
for(i = 0;i < N-1;i++)
mod *= NC;
for(i = 0;i < N;i++)
res = res * NC + use[s[i]];
val[res] = true;
for(i = N;i < len;i++)
{
res = res % mod * NC + use[s[i]];
val[res] = true;
}
int count=0;
mod *= NC;
for(i = 0;i <= mod;i++)
if(val[i])
count++;
printf("%d\n",count);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: