POJ 1200 Crazy Search

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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章