Advertisement
renurtt

Untitled

Mar 20th, 2020
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6. pair<int, string> lz77_pack(string &input)
  7. {
  8.     string res_s = "";
  9.     int res_n = 0;
  10.  
  11.     int background_max_size = 3072;
  12.     int preview_max_size = 1024;
  13.     int background_begin = 0;
  14.     int preview_begin = 0;
  15.  
  16.     int preview_rbound, indexof1, indexof2, length, offset;
  17.     char symb;
  18.     while (preview_begin != input.size())
  19.     {
  20.         preview_rbound = min(preview_begin + preview_max_size, (int) input.size()) - 1;
  21.  
  22.         indexof1 = preview_begin;
  23.         length = 0;
  24.  
  25.         for (int j = preview_begin; j <= preview_rbound; ++j)
  26.         {
  27.             string s = input.substr(preview_begin, j - preview_begin + 1);
  28.             indexof2 = input.find(input.substr(preview_begin, j - preview_begin + 1), background_begin);
  29.  
  30.             if (indexof2 == string::npos || indexof2 >= preview_begin || length + 2 > preview_max_size)
  31.                 break;
  32.  
  33.             indexof1 = indexof2;
  34.             ++length;
  35.         }
  36.  
  37.  
  38.         offset = preview_begin - indexof1;
  39.  
  40.  
  41.         symb = input[preview_begin + length];
  42.  
  43.         res_s += to_string(offset) + " " + to_string(length) + " " + string(1, symb) + " ";
  44.         ++res_n;
  45.  
  46.         preview_begin += length + 1;
  47.         background_begin = max(0, preview_begin - background_max_size);
  48.     }
  49.     return pair<int, string>(res_n, res_s);
  50. }
  51.  
  52. int main()
  53. {
  54.     fstream fin;
  55.     fstream fout;
  56.     fin.open("input.txt", ios::in);
  57.     fout.open("output.txt", ios::out);
  58.     if (fin.is_open())
  59.     {
  60.         string input;
  61.         getline(fin, input);
  62.  
  63.         pair<int, string> res = lz77_pack(input);
  64.         fout << res.first << endl << res.second;
  65.     }
  66.     return 0;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement