Advertisement
bojandam1

Rolling Hash

Nov 8th, 2024
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.35 KB | None | 0 0
  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4.  
  5. int Hash1(string item){
  6.  
  7.     int rez=0;
  8.    
  9.     for( char c : item){
  10.         rez+=c-'a'+1;
  11.     }
  12.  
  13.  
  14.     return rez;
  15. }
  16. int Hash(string item){
  17.  
  18.     int rez=0;
  19.    
  20.     for(int i=0;i<item.size();i++){
  21.         rez+=(item[i]-'a')*pow(26,i);
  22.     }
  23.  
  24.  
  25.     return rez %((int)pow(10,9)+7);
  26. }
  27. void update_hash1(int& val, char old,char nov){
  28.  
  29.     val=val-old+nov;
  30.  
  31. }
  32. void update_hash(int& val, char old,char nov,int len){
  33.  
  34.     val-=old-'a';
  35.     val/=26;
  36.     val+=(nov-'a')*pow(26,len-1);
  37.     val%=((int)pow(10,9)+7);
  38. }
  39.  
  40. int main(){
  41.     string str,item;
  42.  
  43.     cin>>str;
  44.     cin>>item;
  45.  
  46.     int item_val=Hash(item);
  47.     int val=0;
  48.     cout<<"Item value : "<<item_val<<endl;
  49.  
  50.  
  51.     for (int i=0;i<=(int)str.size()-(int)item.size();i++){
  52.         if(i!=0){
  53.             update_hash(val,str[i-1],str[i+item.size()-1],item.size());
  54.         }
  55.         else{
  56.             val=Hash(str.substr(0, item.size()));
  57.  
  58.         }
  59.         cout<<val<<endl;
  60.         if(val==item_val){
  61.             bool same=true;
  62.             for(int j=0;j<item.size();j++){
  63.                 if(item[j]!=str[i+j]){
  64.                     same=false;
  65.                     break;
  66.                 }
  67.             }
  68.             if(same){
  69.                 cout<<"Found at "<<i<<endl;
  70.             }
  71.         }
  72.     }
  73.    
  74.  
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement