pku 1200

pku 1200

2009年7月15日 星期三

题目链接:PKU 1200 Crazy Search

分类:字符串哈希

题目分析与算法模型
        本题是一个字符串哈希,即Rabin-Karp方法,该法算法导论中有介绍,就是将每个子字符串对应算出一个整数(该整数唯一标记字符串),然后统计asca数组存的是字符串中每个不同字母对应的一个值(0到N-1),采用N进制,本题中N即为nc,因为字母的ASCII码最大不会超过122,所以数组开到125足以,具体实现见代码,呵呵

Code:

 1
#include  < stdio.h >
 2 #include  < string .h >
 3 int  n,nc;
 4 char  str[ 20000000 ],asca[ 125 ];
 5 int  hash[ 16000005 ];
 6 int  main()
 7 {
 8    while(scanf("%d%d",&n,&nc)!=EOF)
 9    {
10        scanf("%s",str);
11        int i=0,j,key=0,len=strlen(str),sum,cnt=0;
12        while(str[i])
13        {
14            if(asca[str[i]]==0) asca[str[i]]=key++;
15            i++;
16            if(key==nc) break;
17        }

18        for(i=0;i+n-1<len;i++)
19        {
20            sum=0;
21            for(j=i;j<=i+n-1;j++)sum=sum*nc+asca[str[j]];
22            if(hash[sum]==0
23            {
24                hash[sum]=1;
25                cnt++;
26            }

27        }

28        printf("%d\n",cnt);
29    }

30    return 0;
31}

32
33
34

你可能感兴趣的:(pku 1200)