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;
}