Advertisement
Guest User

Untitled

a guest
Feb 25th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.26 KB | None | 0 0
  1. #include "ReadWriter.h"
  2. #include <algorithm>
  3. //в ReadWriter.h все подключено (Node.h, string, vector, iostream..)
  4. using namespace std;
  5.  
  6. class buffer
  7. {
  8. public:
  9.  
  10.     buffer(int size) : cur(0), len(size)
  11.     {
  12.         buf = new char[size];
  13.     }
  14.  
  15.     void append(char* str, int size)
  16.     {
  17.         int dif = cur + size - len;
  18.         if (dif > 0)
  19.         {
  20.             int l = cur - dif;
  21.             char* old = new char[l];
  22.             memcpy(old, buf + dif, l);
  23.             memcpy(buf, old, l);
  24.             cur = l;
  25.         }
  26.         memcpy(buf + cur, str, size);
  27.         cur += size;
  28.     }
  29.  
  30.     int length()
  31.     {
  32.         return len;
  33.     }
  34.  
  35.     int size()
  36.     {
  37.         return cur;
  38.     }
  39.  
  40.     int freeSize()
  41.     {
  42.         return len - cur;
  43.     }
  44.  
  45.     char operator[](int i)
  46.     {
  47.         return buf[i];
  48.     }
  49.  
  50. private:
  51.  
  52.     int cur;
  53.     int len;
  54.     char* buf;
  55. };
  56.  
  57. class strbuffer
  58. {
  59. public:
  60.  
  61.     strbuffer(string& s, int size)
  62.     {
  63.         len = s.size();
  64.         if (size > s.size())
  65.             bufSize = len;
  66.         else
  67.             bufSize = size;
  68.  
  69.         buf = new char[len];
  70.         memcpy(buf, s.c_str(), len);
  71.     }
  72.  
  73.     char* getBuf(int count)
  74.     {
  75.         char* nbuf = new char[count];
  76.         memcpy(nbuf, buf, count);
  77.         len -= count;
  78.         if (len < bufSize)
  79.             bufSize = len;
  80.         memcpy(buf, buf + count, len);
  81.  
  82.         return nbuf;
  83.     }
  84.  
  85.     int length()
  86.     {
  87.         return len;
  88.     }
  89.  
  90.     int size()
  91.     {
  92.         return bufSize;
  93.     }
  94.  
  95.     char operator[](int i)
  96.     {
  97.         return buf[i];
  98.     }
  99.  
  100. private:
  101.  
  102.     int bufSize;
  103.     char* buf;
  104.     int len;
  105. };
  106.  
  107. // s — исходная строка
  108. // res - вектор троек (offs, len, ch)
  109. // histBufMax, prevBufMax - Макс длины буферов истории и предпросмотра
  110. // функция возвращает список блоков
  111. void encodeLZ77(string& s, vector<Node>& res, int histBufMax, int prevBufMax)
  112. {
  113.     buffer dict(histBufMax);
  114.     strbuffer buf(s, prevBufMax);
  115.  
  116.     while (buf.length() > 0)
  117.     {
  118.         int bufMax = 0;
  119.         int dictLen = 0;
  120.         int firstMax = 0;
  121.  
  122.         while (dictLen < dict.size())
  123.         {
  124.             int first = 0;
  125.             int bufLen = 0;
  126.             while (dictLen < dict.size() && buf[bufLen] != dict[dictLen])
  127.                 ++dictLen;
  128.  
  129.             if(bufLen < buf.size() && dictLen < dict.size() && buf[bufLen] == dict[dictLen])
  130.             {
  131.                 ++bufLen;
  132.                 first = dictLen++;
  133.             }
  134.  
  135.             while (bufLen < buf.size() && dictLen < dict.size() && buf[bufLen] == dict[dictLen])
  136.             {
  137.                 ++bufLen;
  138.                 ++dictLen;
  139.             }
  140.  
  141.             if (bufLen > bufMax)
  142.             {
  143.                 bufMax = bufLen;
  144.                 firstMax = first;
  145.             }
  146.         }
  147.  
  148.         while (bufMax < buf.size() && buf[bufMax] == dict[firstMax])
  149.             ++bufMax;
  150.  
  151.         char c = buf[bufMax];
  152.         dict.append(buf.getBuf(bufMax + 1), bufMax + 1);
  153.         if (bufMax == 0)
  154.             res.push_back(Node(0, 0, c));
  155.         else //                Сука параша ебаная это смещение...
  156.             res.push_back(Node(dict.length() - dict.freeSize() - bufMax + firstMax - 1, bufMax, c));
  157.     }
  158. }
  159.  
  160. int main(int argc, const char* argv[])
  161. {
  162.     // Здесь предлагается задать размер окна в байтах (отдельно буфера предыстории и предпросмотра).
  163.     // В сумме должны образовывать столько, сколько надо в задании.
  164.     // history buffer 3 kb.
  165.     int histBufMax = 1024 * 3;
  166.     // preview buffer 1 kb.
  167.     int prevBufMax = 1024;
  168.  
  169.     ReadWriter rw;
  170.     string s = "";
  171.     //rw.readString(s);
  172.  
  173.     for (int i = 0; i < 5000; ++i)
  174.         s += "a";
  175.     s += "#";
  176.  
  177.     // Основной структурой выбран вектор, так как заранее неизвестно какое количество элементов будет записано.
  178.     vector<Node> v;
  179.  
  180.     encodeLZ77(s, v, histBufMax, prevBufMax);
  181.  
  182.     rw.writeCode(v);
  183.     return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement