Rabin-Karp算法
题目的测试数据不够强大,太水了,我写的代码有两个地方是有问题的1:我没有确定一个取模的限度,也就是说没有取模,如果测试数据够强,肯定出问题,但是这里又牵扯出一个问题,如果我在每一次相乘的时候取模,使之保证在一个限度,那么我得到的哈希值与字符串是否还对应?我认为是对应的!2:我没有处理冲突,这个地方应该是要处理冲突的,建议使用拉链法处理冲突。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 100003
struct node
{
char m[101];
node *next;
};
node map[100009];
int n,nc;
char s[16000005];
int ch[256];
int cat[16000005];
int main()
{
char temp;
int len;
scanf("%d%d%*c",&n,&nc);
scanf("%s",s);
len=strlen(s);
memset(ch,-1,sizeof(ch));
memset(cat,-1,sizeof(cat));
int num=0;
for(int i=0;i<len;i++)
{
if(ch[s[i]]==-1)
{
ch[s[i]]=num++;
}
if(num==nc)
break;
}
//len=len-n+1;
__int64 sum=0;
num=0;
int dog=1;
for(int i=0;i<n-1;i++)
{
dog*=nc;
}
for(int i=0;i<len;i++)
{
sum=sum*nc+ch[s[i]];
if(i>=n-1)
{
if(cat[sum]==-1)
{
cat[sum]=1;
num++;
}
sum-=(dog*ch[s[i-n+1]]);
// printf("%d\n",ch[s[i-n+1]]);
}
}
printf("%d\n",num);
return 0;
}