欲压丁真

Run Settings
LanguageC++
Language Version
Run Command
#include <iostream> #include <vector> #include <cstdint> #include <functional> void compress(const std::vector<uint8_t>& source, std::vector<uint8_t>& result) { result.clear(); if (source.empty()) { return; } ptrdiff_t windowStart = 0; bool isContinuous = false; using ResolveFunc = std::function<void(int)>; ResolveFunc resolveDiscontinuous = [&](int endIndex) -> void { // 处理不连续部分 // 使用模式0,填入[length, ...source[windowStart .. idx]] result.push_back(endIndex - windowStart); result.insert(result.end(), source.begin() + windowStart, source.begin() + endIndex); windowStart = endIndex; }; ResolveFunc resolveContinuous = [&](int endIndex) -> void { // 处理连续部分 // 使用模式1,填入[0x80 | length, source[windowStart]] result.push_back(0x80 | (endIndex - windowStart)); result.push_back(source[windowStart]); windowStart = endIndex; }; for (ptrdiff_t idx = 1; idx < source.size(); idx++) { if (source[idx] == source[idx - 1]) { if (!isContinuous) { // 不连续段结束 isContinuous = true; if (idx - windowStart > 1) { resolveDiscontinuous(idx - 1); } continue; } } else { if (isContinuous) { // 连续段结束,使用模式1 isContinuous = false; resolveContinuous(idx); continue; } } if (idx - windowStart == 0x7F) { // 超过最大长度了,需要截断 (isContinuous ? resolveContinuous : resolveDiscontinuous)(idx); } } // 处理剩下的 (isContinuous ? resolveContinuous : resolveDiscontinuous)(source.size()); } int main() { #ifdef ONLINE_JUDGE std::ios::sync_with_stdio(0); std::cin.tie(0); #endif size_t length; std::cin >> length; auto source = std::vector<uint8_t>(length); auto compressed = std::vector<uint8_t>(); for (auto& v : source) { int num; std::cin >> num; v = static_cast<uint8_t>(num); } compress(source, compressed); std::cout << compressed.size() << '\n'; for (auto& v : compressed) { std::cout << static_cast<int>(v) << ' '; } }
#include <iostream> #include <fstream> #include <vector> #include <cstdint> #include <functional> bool decompress(const std::vector<uint8_t>& source, std::vector<uint8_t>& output, size_t maxLength) { const uint8_t ctrlMask = 0x80; ptrdiff_t index = 0; // 在64位计算机上,ptrdiff_t就是int64_t,32位则是int32_t while (index < source.size()) { uint8_t length = source[index] & (~ctrlMask); if (source[index++] & ctrlMask) { if (index >= source.size()) return false; uint8_t value = source[index++]; output.insert(output.end(), length, value); } else { if (index + length - 1 >= source.size()) return false; auto itStart = source.begin() + index; output.insert(output.end(), itStart, itStart + length); index += length; } if (output.size() > maxLength) { // 防一手 return false; } } return true; } inline bool read(std::istream& in, std::vector<uint8_t>& data) { size_t length; if (!(in >> length)) { return false; } data.resize(length); for (size_t i = 0; i < length; i++) { int value; if (!(in >> value)) { return false; } if (value < 0 || value > 255) { return false; // 确保值在uint8_t范围内 } data[i] = static_cast<uint8_t>(value); } while (in.peek() == '\n' || in.peek() == '\r' || in.peek() == ' ') { in.ignore(); } if (in.peek() != EOF) { return false; // 确保没有多余的字符 } return true; } bool sequenceEqual(const std::vector<uint8_t>& a, const std::vector<uint8_t>& b) { if (a.size() != b.size()) { return false; } for (size_t i = 0; i < a.size(); i++) { if (a[i] != b[i]) { return false; } } return true; } int main() { std::ifstream in("input"); std::ifstream out("output"); std::ifstream user_out("user_output"); std::vector<uint8_t> userCompressionData; std::vector<uint8_t> userDecompressedData; std::vector<uint8_t> rawData; size_t rightCompressionLength; out >> rightCompressionLength; if (!read(user_out, userCompressionData)) { return 1; // 用户输出数据读取失败,直接错 } if (rightCompressionLength != userCompressionData.size()) { return 1; // 压缩后的数据长度不一致,并非最优解,直接错 } read(in, rawData); auto decompressSuccess = decompress(userCompressionData, userDecompressedData, rawData.size()); if (!decompressSuccess) { return 1; // 解压失败,直接错 } return sequenceEqual(userDecompressedData, rawData) ? 0 : 1; // 和原来的数据比较 }
Editor Settings
Theme
Key bindings
Full width
Lines