Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- pair<int, string> lz77_pack(string &input)
- {
- string res_s = "";
- int res_n = 0;
- int background_max_size = 3072;
- int preview_max_size = 1024;
- int background_begin = 0;
- int preview_begin = 0;
- int preview_rbound, indexof1, indexof2, length, offset;
- char symb;
- while (preview_begin != input.size())
- {
- preview_rbound = min(preview_begin + preview_max_size, (int) input.size()) - 1;
- indexof1 = preview_begin;
- length = 0;
- for (int j = preview_begin; j <= preview_rbound; ++j)
- {
- string s = input.substr(preview_begin, j - preview_begin + 1);
- indexof2 = input.find(input.substr(preview_begin, j - preview_begin + 1), background_begin);
- if (indexof2 == string::npos || indexof2 >= preview_begin || length + 2 > preview_max_size)
- break;
- indexof1 = indexof2;
- ++length;
- }
- offset = preview_begin - indexof1;
- symb = input[preview_begin + length];
- res_s += to_string(offset) + " " + to_string(length) + " " + string(1, symb) + " ";
- ++res_n;
- preview_begin += length + 1;
- background_begin = max(0, preview_begin - background_max_size);
- }
- return pair<int, string>(res_n, res_s);
- }
- int main()
- {
- fstream fin;
- fstream fout;
- fin.open("input.txt", ios::in);
- fout.open("output.txt", ios::out);
- if (fin.is_open())
- {
- string input;
- getline(fin, input);
- pair<int, string> res = lz77_pack(input);
- fout << res.first << endl << res.second;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement