Advertisement
Guest User

Untitled

a guest
Feb 24th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. #include "ReadWriter.h"
  2. //в ReadWriter.h все подключено (Node.h, string, vector, iostream..)
  3. using namespace std;
  4.  
  5. pair<int, int> findMaxSubstr(string h, string p) //возвращает пару - индекс в истории и длину
  6. {
  7. string trace = p + "$" + h + p;
  8. int n = trace.length();
  9. int* br = new int[n];
  10. br[0] = 0;
  11. int k = 0, iMax = -1, max = -1;
  12. for (int q = 1; q < n; q++)
  13. {
  14. while (k > 0 && trace[k] != trace[q])
  15. k = br[k - 1];
  16. if (trace[k] == trace[q])
  17. ++k;
  18. br[q] = k;
  19. int inc = q - k + 1;
  20. if (k > max && inc > p.length() && inc < p.length() + h.length() + 1) //наш максимальный префикс должен начинаться в истории
  21. {
  22. max = k;
  23. iMax = inc;
  24. }
  25. if (inc > p.length() + h.length())
  26. break;
  27. }
  28. delete[] br;
  29. /*cout << trace << endl; // слава отладочной печати!
  30. for (int q = 0; q < n; q++)
  31. cout << br[q] << " ";
  32. cout << "\n";*/
  33. if (iMax <= 0 || max <=0) //если не нашли в словаре
  34. return make_pair(0, 0);
  35. return make_pair(h.length() - iMax + p.length() + 1, max); //финт с верным индексом в истории
  36. }
  37. void encodeLZ77(string& s, vector<Node>& res, int histBufMax, int prevBufMax)
  38. {
  39. int lenHist = histBufMax / sizeof(char);
  40. int lenPreview = prevBufMax / sizeof(char);
  41.  
  42. int pointer = 0; //граница между историей и превью
  43. int bH = 0; //начало истории
  44. while (pointer + 1 < s.size())
  45. {
  46. if (pointer - bH > lenHist)
  47. bH += pointer - lenHist;
  48. pair<int, int> t = findMaxSubstr(s.substr(bH, pointer), s.substr(pointer, lenPreview));
  49. int shift = t.second;
  50. if (t.second == 0)
  51. res.push_back(Node(0, 0, s[pointer + shift]));
  52. else
  53. res.push_back(Node(t.first, t.second, s[pointer + shift]));
  54. pointer += ++shift;
  55. }
  56. }
  57.  
  58. int main(int argc, const char* argv[])
  59. {
  60. //Здесь предлагается задать размер окна в байтах (отдельно буфера предыстории и предпросмотра)
  61. //В сумме должны образовывать столько, сколько надо в задании
  62. //history buffer 3 kb
  63. int histBufMax = 1024 * 3;
  64. //preview buffer 1 kb
  65. int prevBufMax = 1024;
  66.  
  67. ReadWriter rw;
  68. string s = "";
  69. rw.readString(s);
  70.  
  71. //Основной структурой выбран вектор, так как заранее неизвестно какое количество элементов будет записано
  72. vector<Node> v;
  73.  
  74. encodeLZ77(s, v, histBufMax, prevBufMax);
  75.  
  76. rw.writeCode(v);
  77. return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement