#include #include #include #include #include #include static bool file_exists(const std::string &path) { struct stat st{}; return ::stat(path.c_str(), &st) == 0; } static std::string make_out_name(const std::string &in) { std::size_t pos = in.find_last_of('.'); if (pos == std::string::npos) return in + ".out"; return in.substr(0, pos) + ".out"; } static bool parse_nonneg_ll(const char *s, long long &out) { if (!s || *s == '\0') return false; char *end = nullptr; errno = 0; long long v = std::strtoll(s, &end, 10); if (errno != 0 || end == s || *end != '\0') return false; if (v < 0) return false; out = v; return true; } int main(int argc, char *argv[]) { if (argc != 3) { std::cerr << "Usage: " << argv[0] << " input_file replace_count\n"; return -1; } std::string in_path = argv[1]; long long target = 0; if (!parse_nonneg_ll(argv[2], target)) { std::cerr << "Usage: " << argv[0] << " input_file replace_count\n"; return -1; } if (!file_exists(in_path)) { std::cerr << "Error: input file does not exist.\n"; return -1; } std::ifstream in(in_path); if (!in) { std::cerr << "Error: cannot open input file.\n"; return -1; } std::string out_path = make_out_name(in_path); std::ofstream out(out_path); if (!out) { std::cerr << "Error: cannot create output file.\n"; return -1; } long long replacements = 0; std::string line; while (std::getline(in, line)) { if (!line.empty() && replacements < target) { for (std::size_t i = 1; i < line.size() && replacements < target; ++i) { if (line[i] == line[i - 1]) { if (line[i] != ' ') { line[i] = ' '; ++replacements; } } } } out << line; if (!in.eof()) out << '\n'; if (!out) { std::cerr << "Error: write error.\n"; return -1; } } if (!in.eof() && in.fail()) { std::cerr << "Error: read error.\n"; return -1; } if (replacements != target) { std::cerr << "Error: could not perform exactly requested replacements.\n"; return -1; } std::cout << replacements << std::endl; return 0; }