POJ_1200_Crazy Search

集合最多为1600的字符串,hash了N个进制

//hash基础题, 转化为 nc进制
#include <stdio.h>
#include <string.h>
#define MAX 1600000
char s[MAX];
int Hash[MAX*10]={0},a[130];
int main()
{
    int i,j,h,sum,n,nc,num,len;
    scanf("%d%d%s",&n,&nc,s);
    memset(a,-1,sizeof(a));
    len=strlen(s);
    for(i=0;i<len;++i)
        if(a[s[i]]==-1)
            a[s[i]]=1;
    for(i='a',num=0;i<='z';++i)
        if(a[i]!=-1)
            a[i]=num++;
    for(i=0,sum=0;s[i+n-1]!=0;++i)
    {
        h=0;
        for(j=i;j<i+n;++j)
            h=h*nc+a[s[j]];
        if(!Hash[h])
        {
            Hash[h]=1;
            sum++;
        }
    }
    printf("%d\n",sum);
    return 0;
}
posted @ 2013-05-15 19:43  小仪在努力~  阅读(114)  评论(0编辑  收藏  举报