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;

}

你可能感兴趣的:(search)