-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdecoder.cpp
More file actions
114 lines (87 loc) · 2.74 KB
/
decoder.cpp
File metadata and controls
114 lines (87 loc) · 2.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// SHASHWAT SINGH
// 20ME02039
// Command to compile file - "/usr/bin/g++ -fdiagnostics-color=always -std=c++17 -g decoder.cpp -o decoder -ldivsufsort"
#include <bits/stdc++.h>
#include <divsufsort.h>
using namespace std;
string inverseBurrowsWheelerTransform(const string& bwt) {
int n = bwt.length();
vector<pair<char, int>> indexed_bwt(n);
for (int i = 0; i < n; i++) {
indexed_bwt[i] = {bwt[i], i};
}
sort(indexed_bwt.begin(), indexed_bwt.end());
string original_string;
int idx = 0;
for (int i = 0; i < n; i++) {
idx = indexed_bwt[idx].second;
original_string += indexed_bwt[idx].first;
}
return original_string;
}
string reverseDynamicByteRemapping(const string& encoded, const map<char, string>& byteMap) {
string original = "";
string currentByte = "";
for (char bit : encoded) {
currentByte += bit;
for (const auto& entry : byteMap) {
if (entry.second == currentByte) {
original += entry.first;
currentByte = "";
break;
}
}
}
return original;
}
string reverseVerticalByteReading(const vector<string>& bitStrings) {
string original = "";
int size = bitStrings[0].size();
for (int i = 0; i < size; ++i) {
for (const string& bits : bitStrings) {
original += bits[i];
}
}
return original;
}
string reverseRunLengthEncoding(const vector<int>& rle) {
string original = "";
for (size_t i = 0; i < rle.size(); ++i) {
char bit = (i % 2 == 0) ? '0' : '1';
for (int j = 0; j < rle[i]; ++j) {
original += bit;
}
}
return original;
}
int main() {
ifstream encodedFile("encoded.txt");
ifstream remappingFile("remapping.txt");
if (!encodedFile.is_open() || !remappingFile.is_open()) {
cerr << "Unable to open input files!" << endl;
return 1;
}
vector<int> rle;
int run;
while (encodedFile >> run) {
rle.push_back(run);
}
map<char, string> byteMap;
char c;
string bits;
while (remappingFile >> c >> bits) {
byteMap[c] = bits;
}
encodedFile.close();
remappingFile.close();
string verticalString = reverseRunLengthEncoding(rle);
vector<string> bitStrings;
for (int i = 0; i < 8; ++i) {
bitStrings.push_back(verticalString.substr(i * verticalString.size() / 8, verticalString.size() / 8));
}
string remapped = reverseVerticalByteReading(bitStrings);
string original = reverseDynamicByteRemapping(remapped, byteMap);
string inverseBWST = inverseBurrowsWheelerTransform(original);
cout << "Decoded original string: " << inverseBWST << endl;
return 0;
}