Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <queue>
- #include <fstream>
- using namespace std;
- class LZ77Tuple
- {
- public:
- int back_pos;
- int len;
- char let;
- LZ77Tuple(int back_pos, int len, char let)
- {
- this->back_pos = back_pos;
- this->len = len;
- this->let = let;
- }
- };
- LZ77Tuple find(string line, int current)
- {
- queue<LZ77Tuple> q;
- int count = 0;
- if (current < 3072)
- {
- for (int i = 1; i <= current; i++)
- {
- if (line[current - i] == line[current])
- {
- count++;
- q.push(LZ77Tuple(i, 1, line[current + 1]));
- }
- }
- }
- else
- {
- for (int i = 1; i <= 3072; i++)
- {
- if (line[current - i] == line[current])
- {
- count++;
- q.push(LZ77Tuple(i, 1, line[current + 1]));
- }
- }
- }
- LZ77Tuple ret(0, 0, line[current]);
- if (count != 0)
- {
- do
- {
- ret = q.front();
- if (line[current - ret.back_pos + ret.len] == line[current + ret.len])
- {
- q.push(LZ77Tuple(ret.back_pos, ret.len + 1, line[current + ret.len + 1]));
- }
- q.pop();
- } while (!q.empty());
- while (line[current + ret.len - ret.back_pos] == line[current + ret.len])
- {
- ret.len++;
- ret.let = line[current + ret.len];
- }
- }
- return ret;
- }
- int main()
- {
- ifstream fin("input.txt");
- ofstream fout("output.txt");
- string line;
- fin >> line;
- vector<LZ77Tuple> v;
- int current = 0;
- while (current != line.size())
- {
- LZ77Tuple n = find(line, current);
- current += n.len + 1;
- v.push_back(n);
- }
- fout << v.size() << "\n";
- for (LZ77Tuple i : v)
- fout << i.back_pos << " " << i.len << " " << i.let << " ";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement