Rabin-Karp文字列検索アルゴリズム学習:poj 1200


もともとHashを勉強しようとしたが、PPTが言った最初のアルゴリズムが文字列処理に関連しているのを見て、もともとHashの中にも文字列Hashを専門に話しているものがあるので、「アルゴリズム導論」の分類に従って、これを「文字列処理」に分けましょう.
Rabin-Karpアルゴリズムの思想は超簡単です:d個の異なるアルファベットの文字列を1つのd進数に変換します.得られたこの数字が多すぎると1つの質量数をモデリングすることができるが、複数の文字列の数値が同じになる可能性があるため、素朴なアルゴリズムで判断することができる(1対1で比較する).(以下より抜粋:
 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
    "
    ,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