#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
namespace
{
/// {п4,a}b4c{2,p} -> aaaab4cpp
template<class InputIt, class OutputIt>
OutputIt rle_decode(InputIt first, InputIt last, OutputIt d_first)
{
while(first != last) {
if (*first != '{') {
*d_first++ = *first++; // copy the input to the output as is
}
else { // decode {count,char} RLE run
++first; // skip {
// read count
uintmax_t count = 0;
for ( ; first != last && '0' <= *first && *first <= '9'; ++first )
count += 10 * count + (*first - '0'); //NOTE: ignore overflow
if (first == last || *first++ != ',' || first == last)
throw std::invalid_argument("missing comma or char in {count,char}");
// output current character *count* times
d_first = std::fill_n(d_first, count, *first++);
if (first == last || *first++ != '}')
throw std::invalid_argument("expected '}'");
}
}
return d_first;
}
}
int main()
{
std::string text = "{4,a}b4c{2,p}";
std::string s;
rle_decode(std::begin(text), std::end(text), std::back_inserter(s));
std::cout << s << '\n';
rle_decode(std::begin(text), std::end(text), std::ostream_iterator<char>(std::cout));
std::cout << '\n';
std::istream_iterator<char> chars{std::cin}, eof;
rle_decode(chars, eof, std::ostream_iterator<char>(std::cout));
std::cout << '\n';
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CgpuYW1lc3BhY2UKewogICAgLy8vIHvQvzQsYX1iNGN7MixwfSAtPiBhYWFhYjRjcHAKICAgIHRlbXBsYXRlPGNsYXNzIElucHV0SXQsIGNsYXNzIE91dHB1dEl0PgogICAgT3V0cHV0SXQgcmxlX2RlY29kZShJbnB1dEl0IGZpcnN0LCBJbnB1dEl0IGxhc3QsIE91dHB1dEl0IGRfZmlyc3QpCiAgICB7CiAgICAgIHdoaWxlKGZpcnN0ICE9IGxhc3QpIHsKICAgICAgICBpZiAoKmZpcnN0ICE9ICd7JykgewogICAgICAgICAgKmRfZmlyc3QrKyA9ICpmaXJzdCsrOyAvLyBjb3B5IHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0IGFzIGlzCiAgICAgICAgfQogICAgICAgIGVsc2UgeyAvLyBkZWNvZGUge2NvdW50LGNoYXJ9IFJMRSBydW4KICAgICAgICAgICsrZmlyc3Q7IC8vIHNraXAgewogIAogICAgICAgICAgLy8gcmVhZCBjb3VudAogICAgICAgICAgdWludG1heF90IGNvdW50ID0gMDsKICAgICAgICAgIGZvciAoIDsgZmlyc3QgIT0gbGFzdCAmJiAnMCcgPD0gKmZpcnN0ICYmICpmaXJzdCA8PSAnOSc7ICsrZmlyc3QgKQogICAgICAgICAgICBjb3VudCArPSAxMCAqIGNvdW50ICsgKCpmaXJzdCAtICcwJyk7IC8vTk9URTogaWdub3JlIG92ZXJmbG93CiAgCiAgICAgICAgICBpZiAoZmlyc3QgPT0gbGFzdCB8fCAqZmlyc3QrKyAhPSAnLCcgfHwgZmlyc3QgPT0gbGFzdCkKICAgICAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJtaXNzaW5nIGNvbW1hIG9yIGNoYXIgaW4ge2NvdW50LGNoYXJ9Iik7CiAgCiAgICAgICAgICAvLyBvdXRwdXQgY3VycmVudCBjaGFyYWN0ZXIgKmNvdW50KiB0aW1lcwogICAgICAgICAgZF9maXJzdCA9IHN0ZDo6ZmlsbF9uKGRfZmlyc3QsIGNvdW50LCAqZmlyc3QrKyk7CiAgCiAgICAgICAgICBpZiAoZmlyc3QgPT0gbGFzdCB8fCAqZmlyc3QrKyAhPSAnfScpCiAgICAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiZXhwZWN0ZWQgJ30nIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBkX2ZpcnN0OwogICAgfQogIH0KCmludCBtYWluKCkKewogIHN0ZDo6c3RyaW5nIHRleHQgPSAiezQsYX1iNGN7MixwfSI7CiAgc3RkOjpzdHJpbmcgczsKICBybGVfZGVjb2RlKHN0ZDo6YmVnaW4odGV4dCksIHN0ZDo6ZW5kKHRleHQpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIocykpOwogIHN0ZDo6Y291dCA8PCBzIDw8ICdcbic7CgogIHJsZV9kZWNvZGUoc3RkOjpiZWdpbih0ZXh0KSwgc3RkOjplbmQodGV4dCksIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxjaGFyPihzdGQ6OmNvdXQpKTsKICBzdGQ6OmNvdXQgPDwgJ1xuJzsKCiAgc3RkOjppc3RyZWFtX2l0ZXJhdG9yPGNoYXI+IGNoYXJze3N0ZDo6Y2lufSwgZW9mOwogIHJsZV9kZWNvZGUoY2hhcnMsIGVvZiwgc3RkOjpvc3RyZWFtX2l0ZXJhdG9yPGNoYXI+KHN0ZDo6Y291dCkpOwogIHN0ZDo6Y291dCA8PCAnXG4nOwp9Cg==