mitkonikov

Compression Algo Unfinished

Mar 1st, 2019
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. string COMPRESS(string s, int increment) {
  6.     string unchanged = s;
  7.     s += 'O';
  8.  
  9.     /*if ((s.size() - 2) / increment == 2) {
  10.         if (s.substr(0, increment) == s.substr(increment, increment)) {
  11.             return s.substr(0, increment) + 'R';
  12.         }
  13.  
  14.         return s;
  15.     }*/
  16.  
  17.     if (s.size() == 1) return "";
  18.  
  19.     string out = "";
  20.     int last_i = 0;
  21.     for (int i = increment; i <= s.size() - increment - 1; i += increment) {
  22.  
  23.         /*cout << s.substr(i - increment, increment) << " " << s.substr(i, increment) << endl;
  24.         cout << " increment: " << increment << endl;
  25.         cout << " s.size() = " << s.size() << endl;
  26.         cout << " i, increment: " << (i + increment >= s.size()) << endl;*/
  27.  
  28.         if (s.substr(i - increment, increment) == s.substr(i, increment)) {
  29.             out = out + s.substr(i - increment, increment) + 'R';
  30.             i += increment;
  31.         } else {
  32.             out += s.substr(i - increment, increment);
  33.         }
  34.  
  35.         last_i = i;
  36.     }
  37.  
  38.     // cout << last_i << endl;
  39.  
  40.     string ELSE = s.substr(last_i, s.size() - (last_i) - 2);
  41.     out += ELSE;
  42.  
  43.     // cout << " ELSE: " << ELSE << endl;
  44.     // cout << " OUT: " << out << endl;
  45.  
  46.     return out;
  47. }
  48.  
  49. int main()
  50. {
  51.     string s;
  52.     cin >> s;
  53.  
  54.     string compressed = s;
  55.     string toMatch = s;
  56.     // this compresses the string as much as it can
  57.     for (int k = 0; true; ++k) {
  58.         bool notFailed = false;
  59.         // this loop goes through every possible length match
  60.         // ex:  abababbabb => if i = 2:
  61.         //      ab ab ab ba ab b
  62.         // out: abRabbaabb => i++
  63.         for (int i = 1; i < ceil(s.size() / 2.00); ++i) {
  64.             compressed = COMPRESS(compressed + 'S', i);
  65.             if (!compressed.compare(toMatch)) {
  66.                 toMatch = compressed;
  67.                 notFailed = true;
  68.             }
  69.         }
  70.  
  71.         if (!notFailed) break;
  72.     }
  73.  
  74.     cout << compressed.size() << endl;
  75.  
  76.     // cout << "FINAL : " << COMPRESS(s + "S", 1) << endl;
  77.  
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment