| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
- #include <iostream>
 
 - #include <string>
 
 - #include <cstring>
 
 - #include <cmath>
 
  
- const int seed = 31;
 
 - using namespace std;
 
  
- long long hash(string &s)
 
 - {
 
 -     long long hash_code = 0;
 
 -     for(int i=0; i<s.size()-1; ++i){
 
 -         hash_code = ((hash_code + s.at(i)) * seed) % __LONG_LONG_MAX__;
 
 -     }
 
 -     hash_code = (hash_code + s.at(s.size()-1)) % __LONG_LONG_MAX__;
 
 -     return hash_code;
 
 - }
 
  
- void RabinKarp(string &source, string &pattern)
 
 - {
 
 -         if(source.size()<pattern.size())
 
 -         {
 
 -                 cout << "Error" << endl;
 
 -                 return;
 
 -         }
 
 -         long long hash_pattern = hash(pattern);
 
 -         long long old_hash = 0;
 
 -         string begin = source.substr(0, pattern.size());
 
 -         old_hash = hash(begin);
 
 -         if(old_hash == hash_pattern)
 
 -                 cout << "begin_index: " << 0 << endl;
 
 -         for(int i=1; i<=source.size()-pattern.size(); ++i)
 
 -         {
 
 -                 old_hash = (old_hash - source.at(i-1) * pow(seed, pattern.size()-1)) * seed + source.at(i+pattern.size()-1);
 
 -                 if(old_hash == hash_pattern)
 
 -                         cout << "begin_index: " << i << endl; 
 
 -         }        
 
 - } 
 
  
- int main()
 
 - {
 
 -         string a, b;
 
 -         cin >> a >> b;
 
 -         RabinKarp(a, b);        
 
 -     return 0;
 
 - }
 
 
  复制代码 |   
 
 
 
 |