Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <fstream>
  5. using namespace std;
  6.  
  7. class LZ77Tuple
  8. {
  9. public:
  10.     int back_pos;
  11.     int len;
  12.     char let;
  13.  
  14.     LZ77Tuple(int back_pos, int len, char let)
  15.     {
  16.         this->back_pos = back_pos;
  17.         this->len = len;
  18.         this->let = let;
  19.     }
  20. };
  21.  
  22. LZ77Tuple find(string line, int current)
  23. {
  24.     queue<LZ77Tuple> q;
  25.     int count = 0;
  26.     if (current < 3072)
  27.     {
  28.         for (int i = 1; i <= current; i++)
  29.         {
  30.             if (line[current - i] == line[current])
  31.             {
  32.                 count++;
  33.                 q.push(LZ77Tuple(i, 1, line[current + 1]));
  34.             }
  35.         }
  36.     }
  37.     else
  38.     {
  39.         for (int i = 1; i <= 3072; i++)
  40.         {
  41.             if (line[current - i] == line[current])
  42.             {
  43.                 count++;
  44.                 q.push(LZ77Tuple(i, 1, line[current + 1]));
  45.             }
  46.         }
  47.     }
  48.     LZ77Tuple ret(0, 0, line[current]);
  49.     if (count != 0)
  50.     {
  51.         do
  52.         {
  53.             ret = q.front();
  54.             if (line[current - ret.back_pos + ret.len] == line[current + ret.len])
  55.             {
  56.                 q.push(LZ77Tuple(ret.back_pos, ret.len + 1, line[current + ret.len + 1]));
  57.             }
  58.             q.pop();
  59.         } while (!q.empty());
  60.         while (line[current + ret.len - ret.back_pos] == line[current + ret.len])
  61.         {
  62.             ret.len++;
  63.             ret.let = line[current + ret.len];
  64.         }
  65.     }
  66.     return ret;
  67. }
  68.  
  69.  
  70. int main()
  71. {
  72.     ifstream fin("input.txt");
  73.     ofstream fout("output.txt");
  74.     string line;
  75.     fin >> line;
  76.     vector<LZ77Tuple> v;
  77.     int current = 0;
  78.     while (current != line.size())
  79.     {
  80.         LZ77Tuple n = find(line, current);
  81.         current += n.len + 1;
  82.         v.push_back(n);
  83.     }
  84.     fout << v.size() << "\n";
  85.     for (LZ77Tuple i : v)
  86.         fout << i.back_pos << " " << i.len << " " << i.let << " ";
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement