Rabin-Karp字符串查找算法学习:poj1200

   本来准备学习Hash的,结果看PPT讲的第一个算法竟然是跟字符串处理相关的,本来Hash中也有一块专门讲字符串Hash的,就按照《算法导论》中的分类,把这个分到“字符串处理”中去吧!

    Rabin-Karp算法的思想超级简单:把有d个不同字母的字符串转化为一个d进制数。如果得到的这个数字太多可以模一个质数,但这样要进行一些额外的判断,因为可能有多个字串的数值会相同,这时可以用朴素算法判断(就是一对一进行比较)。(摘自:

 http://skyhacker.ixiezi.com/2010/12/20/poj1200-crazysearchrabin-karp/)

   对于POJ上面的那道题目就简单了!

 
 
  1. #include<stdio.h> 
  2.  #include<string.h> 
  3.  /* 
  4.   * Rabin-Karp算法的核心思想:把一个含NC个不同字母的字符串 转化为NC进制的数 
  5.   * */ 
  6.  #define MM 16000005 
  7.  char s[MM]; 
  8.  int hash[MM]; 
  9.  int asc[128]; 
  10.   
  11.  //把NC进制的数转化为10进制的数 
  12.  int n,nc; 
  13.  void init(){ 
  14.     memset(asc,0,sizeof(asc)); 
  15.     memset(hash,0,sizeof(hash)); 
  16.  } 
  17.  //把NC进制的数 转化成10进制的数 
  18.  void solve(){ 
  19.     int ans=0; 
  20.     int len=strlen(s); 
  21.     //按照字符出现的先后顺序确定字符的大小 
  22.     for(int i=0,j=0;i<len;i++){ 
  23.         if(!asc[s[i]])asc[s[i]]=j++; 
  24.         if(j==nc)break
  25.     } 
  26.     //把子串映射到hash中去 
  27.     int key; 
  28.     for(int i=0;i<len-n+1;i++){ 
  29.         key=0; 
  30.         for(int j=i;j<i+n;j++)key+=key*nc+asc[s[j]]; 
  31.         if(!hash[key])hash[key]=1,ans++; 
  32.     } 
  33.     printf("%d\n",ans); 
  34.  } 
  35.  int main(){ 
  36.     scanf("%d %d",&n,&nc); 
  37.     scanf("%s",s); 
  38.     init(); 
  39.     solve(); 
  40.  } 


参考文档:

http://www.ituring.com.cn/article/1759 http://www.cnblogs.com/Jason-Damon/archive/2012/03/31/2426745.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值