Advertisement
Josif_tepe

Untitled

Nov 14th, 2024
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.60 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. typedef long long ll;
  5. class String {
  6.     char *chars;
  7.     unsigned int length;
  8.  
  9. public:
  10.     String() : chars(nullptr), length(0) {}
  11.  
  12.     ~String() {
  13.         delete[] chars;
  14.     }
  15.  
  16.     // Copy constructor
  17.     String(const String& other) : length(other.length) {
  18.         chars = new char[length + 1];
  19.         for (unsigned int i = 0; i < length; i++) {
  20.             chars[i] = other.chars[i];
  21.         }
  22.         chars[length] = '\0';
  23.     }
  24.  
  25.    
  26.     String& operator=(const String& other) {
  27.         if (this != &other) {
  28.             delete[] chars;
  29.             length = other.length;
  30.             chars = new char[length + 1];
  31.             for (unsigned int i = 0; i < length; i++) {
  32.                 chars[i] = other.chars[i];
  33.             }
  34.             chars[length] = '\0';
  35.         }
  36.         return *this;
  37.     }
  38.  
  39.     // setiranje na vrednostite
  40.     void setString(const char* str) {
  41.         length = 0;
  42.         while (str[length] != '\0') length++;  // dolzinata da se najde
  43.        
  44.         chars = new char[length + 1];
  45.         for (unsigned int i = 0; i < length; i++) {
  46.             chars[i] = str[i];
  47.         }
  48.         chars[length] = '\0';
  49.     }
  50.     char getChar(unsigned int i) const {
  51.         if(i < length) {
  52.             return chars[i];
  53.         }
  54.         return '\0';
  55.     }
  56.     unsigned int getLength() const {
  57.         return length;
  58.     }
  59.    
  60.  
  61. };
  62.  
  63.  
  64. void rabin_carp(String text, String pattern, ll base, ll MOD) {
  65.     unsigned int text_length = text.getLength();
  66.     unsigned int pattern_length = pattern.getLength();
  67.    
  68.     unsigned int n = text.getLength();
  69.     unsigned int window_size = pattern.getLength();
  70.    
  71.     ll pattern_hash = 0, sum = 0;
  72.     for(unsigned int i = 0; i < window_size; i++) {
  73.         pattern_hash = (pattern_hash * base + (ll) pattern.getChar(i)) % MOD;
  74.         sum += (ll) pattern.getChar(i);
  75.     }
  76.     vector<ll> power(n + 1, 1);
  77.    
  78.     for(ll i = 1; i <= n; i++) {
  79.         power[i] = (power[i - 1] * base) % MOD;
  80.     }
  81.    
  82.     ll current_hash = 0, pref_sum = 0;
  83.     for(unsigned int i = 0; i < window_size; i++) {
  84.         current_hash = (current_hash * base + (ll) text.getChar(i)) % MOD;
  85.         pref_sum += (ll) text.getChar(i);
  86.     }
  87.    
  88.     if(sum == pref_sum and current_hash == pattern_hash) {
  89.         bool ok = true;
  90.         for(unsigned int i = 0; i < window_size; i++) {
  91.             if(text.getChar(i) != pattern.getChar(i)) {
  92.                 ok = false;
  93.                 break;
  94.             }
  95.         }
  96.         if(ok) {
  97.             cout << "Matching at: " << 0 << endl;
  98.         }
  99.     }
  100.     for(unsigned int i = 1; i <= n - window_size; i++) {
  101.        
  102.         current_hash = (current_hash - power[window_size - 1] * (ll) text.getChar(i - 1)) % MOD;
  103.        
  104.         current_hash = (current_hash * base + text.getChar(i + window_size - 1)) % MOD;
  105.         pref_sum -= (ll) text.getChar(i - 1);
  106.         pref_sum += (ll) text.getChar(i + window_size - 1);
  107.         if(pref_sum == sum and current_hash == pattern_hash) {
  108.             bool ok = true;
  109.             for(unsigned int j = i; j < i + window_size; j++) {
  110.                 if(text.getChar(j) != pattern.getChar(j - i)) {
  111.                     ok = false;
  112.                 }
  113.             }
  114.             if(ok) {
  115.                 cout << "Matching at: " << i << endl;
  116.             }
  117.         }
  118.        
  119.     }
  120. }
  121.  
  122. int main() {
  123.     String text;
  124.     text.setString("ABBCAABCBB");
  125.    
  126.     String pattern;
  127.     pattern.setString("BC");
  128.    
  129.     ll MOD = 1e9 + 7;
  130.     rabin_carp(text, pattern, 26, MOD);
  131.    
  132. }
  133.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement