#include <iostream>
#include <iostream>
#include <string>
#include <regex>
using namespace std;
string WordReplaceMatches(string str, regex pattern)
{
smatch matches;
while(regex_search(str, matches, pattern))
{
string matches0;
matches0+=matches[0];
string wordTemp;
if (matches[1]!="")
wordTemp+=matches[1];
else
wordTemp+=matches[3];
size_t position=-1;
int licznik=0;
while((position=matches0.find(wordTemp, ++position))!=string::npos)
{
licznik++;
}
string patternTempReplace;
patternTempReplace+=wordTemp;
patternTempReplace+='/';
patternTempReplace+=to_string(licznik);
str=regex_replace(str, pattern, patternTempReplace, regex_constants::format_first_only);
}
return str;
}
string LetterReplaceMatches(string str, regex pattern)
{
smatch matches;
while(regex_search(str, matches, pattern))
{
string matchTemp=matches[0];
string patternTemp;
patternTemp+=matches[1];
patternTemp+='*';
patternTemp+=to_string(matchTemp.size());
str=regex_replace(str,pattern,patternTemp,regex_constants::format_first_only);
}
return str;
}
string Decomp_LetterReplaceMatches(string str, regex pattern)
{
smatch matches;
while(regex_search(str, matches, pattern))
{
string slicznik=matches[0];
slicznik=slicznik.substr(2,slicznik.size()-1);
int licznik=stoi(slicznik);
string letterTemp=matches[0];
letterTemp=letterTemp.substr(0,1);
string patternTemp;
for (int i=0; i<licznik; i++)
{
patternTemp+=letterTemp;
}
str=regex_replace(str,pattern, patternTemp, regex_constants::format_first_only);
}
return str;
}
string Decomp_WordReplaceMatches(string str, regex pattern)
{
smatch matches;
while(regex_search(str, matches, pattern))
{
string temp=matches[0];
size_t position=temp.find("/");
string tempWord=temp.substr(0,position);
int licznik=stoi(temp.substr(position+1,temp.size()-position));
string patternTemp;
for (int i=0; i<licznik; i++)
{
patternTemp+=tempWord+" ";
}
patternTemp.pop_back();
str=regex_replace(str,pattern, patternTemp, regex_constants::format_first_only);
}
return str;
}
int main()
{
string choose;
getline(cin,choose);
if (choose=="KOMPRESJA")
{
string line,str;
while (getline(cin,line) && line!="")
{
if (line[line.size()-1]==' ') str+=line;
else str+=line+" ";
}
if (str[str.size()-1]==' ') str.pop_back();
regex letter_pattern("([a-z])\\1{3,}");
str=LetterReplaceMatches(str,letter_pattern);
regex word_pattern ("([a-z]\\b)(\\s\\1\\b){2,}|([*a-z0-9]{2,}\\b)(\\s\\3\\b)+");
str=WordReplaceMatches(str,word_pattern);
cout<<str;
}
else if (choose=="DEKOMPRESJA")
{
string line,str;
while (getline(cin,line) && line!="")
{
if (line[line.size()-1]==' ') str+=line;
else str+=line+" ";
}
if (str[str.size()-1]==' ') str.pop_back();
regex letter_pattern("[a-z]{1}\\*\\d+");
str=Decomp_LetterReplaceMatches(str,letter_pattern);
regex word_pattern ("\\w+\\/\\d+");
str=Decomp_WordReplaceMatches(str,word_pattern);
cout<<str;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxyZWdleD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cmluZyBXb3JkUmVwbGFjZU1hdGNoZXMoc3RyaW5nIHN0ciwgcmVnZXggcGF0dGVybikKewogICAgc21hdGNoIG1hdGNoZXM7CiAgICB3aGlsZShyZWdleF9zZWFyY2goc3RyLCBtYXRjaGVzLCBwYXR0ZXJuKSkKICAgIHsKICAgICAgICBzdHJpbmcgbWF0Y2hlczA7CiAgICAgICAgbWF0Y2hlczArPW1hdGNoZXNbMF07CiAgICAgICAgc3RyaW5nIHdvcmRUZW1wOwogICAgICAgIGlmIChtYXRjaGVzWzFdIT0iIikKICAgICAgICAgICAgd29yZFRlbXArPW1hdGNoZXNbMV07CiAgICAgICAgZWxzZQogICAgICAgICAgICB3b3JkVGVtcCs9bWF0Y2hlc1szXTsKICAgICAgICBzaXplX3QgcG9zaXRpb249LTE7CiAgICAgICAgaW50IGxpY3puaWs9MDsKICAgICAgICB3aGlsZSgocG9zaXRpb249bWF0Y2hlczAuZmluZCh3b3JkVGVtcCwgKytwb3NpdGlvbikpIT1zdHJpbmc6Om5wb3MpCiAgICAgICAgewogICAgICAgICAgICBsaWN6bmlrKys7CiAgICAgICAgfQogICAgICAgIHN0cmluZyBwYXR0ZXJuVGVtcFJlcGxhY2U7CiAgICAgICAgcGF0dGVyblRlbXBSZXBsYWNlKz13b3JkVGVtcDsKICAgICAgICBwYXR0ZXJuVGVtcFJlcGxhY2UrPScvJzsKICAgICAgICBwYXR0ZXJuVGVtcFJlcGxhY2UrPXRvX3N0cmluZyhsaWN6bmlrKTsKICAgICAgICBzdHI9cmVnZXhfcmVwbGFjZShzdHIsIHBhdHRlcm4sIHBhdHRlcm5UZW1wUmVwbGFjZSwgcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfZmlyc3Rfb25seSk7CiAgICB9CiAgICByZXR1cm4gc3RyOwp9CnN0cmluZyBMZXR0ZXJSZXBsYWNlTWF0Y2hlcyhzdHJpbmcgc3RyLCByZWdleCBwYXR0ZXJuKQp7CiAgICBzbWF0Y2ggbWF0Y2hlczsKICAgIHdoaWxlKHJlZ2V4X3NlYXJjaChzdHIsIG1hdGNoZXMsIHBhdHRlcm4pKQogICAgewogICAgICAgIHN0cmluZyBtYXRjaFRlbXA9bWF0Y2hlc1swXTsKICAgICAgICBzdHJpbmcgcGF0dGVyblRlbXA7CiAgICAgICAgcGF0dGVyblRlbXArPW1hdGNoZXNbMV07CiAgICAgICAgcGF0dGVyblRlbXArPScqJzsKICAgICAgICBwYXR0ZXJuVGVtcCs9dG9fc3RyaW5nKG1hdGNoVGVtcC5zaXplKCkpOwogICAgICAgIHN0cj1yZWdleF9yZXBsYWNlKHN0cixwYXR0ZXJuLHBhdHRlcm5UZW1wLHJlZ2V4X2NvbnN0YW50czo6Zm9ybWF0X2ZpcnN0X29ubHkpOwogICAgfQogICAgcmV0dXJuIHN0cjsKfQoKc3RyaW5nIERlY29tcF9MZXR0ZXJSZXBsYWNlTWF0Y2hlcyhzdHJpbmcgc3RyLCByZWdleCBwYXR0ZXJuKQp7CiAgICBzbWF0Y2ggbWF0Y2hlczsKICAgIHdoaWxlKHJlZ2V4X3NlYXJjaChzdHIsIG1hdGNoZXMsIHBhdHRlcm4pKQogICAgewogICAgICAgIHN0cmluZyBzbGljem5paz1tYXRjaGVzWzBdOwogICAgICAgIHNsaWN6bmlrPXNsaWN6bmlrLnN1YnN0cigyLHNsaWN6bmlrLnNpemUoKS0xKTsKICAgICAgICBpbnQgbGljem5paz1zdG9pKHNsaWN6bmlrKTsKICAgICAgICBzdHJpbmcgbGV0dGVyVGVtcD1tYXRjaGVzWzBdOwogICAgICAgIGxldHRlclRlbXA9bGV0dGVyVGVtcC5zdWJzdHIoMCwxKTsKICAgICAgICBzdHJpbmcgcGF0dGVyblRlbXA7CiAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxpY3puaWs7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHBhdHRlcm5UZW1wKz1sZXR0ZXJUZW1wOwogICAgICAgIH0KICAgICAgICBzdHI9cmVnZXhfcmVwbGFjZShzdHIscGF0dGVybiwgcGF0dGVyblRlbXAsIHJlZ2V4X2NvbnN0YW50czo6Zm9ybWF0X2ZpcnN0X29ubHkpOwogICAgfQogICAgcmV0dXJuIHN0cjsKfQoKc3RyaW5nIERlY29tcF9Xb3JkUmVwbGFjZU1hdGNoZXMoc3RyaW5nIHN0ciwgcmVnZXggcGF0dGVybikKewogICAgc21hdGNoIG1hdGNoZXM7CiAgICB3aGlsZShyZWdleF9zZWFyY2goc3RyLCBtYXRjaGVzLCBwYXR0ZXJuKSkKICAgIHsKICAgICAgICBzdHJpbmcgdGVtcD1tYXRjaGVzWzBdOwoKICAgICAgICBzaXplX3QgcG9zaXRpb249dGVtcC5maW5kKCIvIik7CiAgICAgICAgc3RyaW5nIHRlbXBXb3JkPXRlbXAuc3Vic3RyKDAscG9zaXRpb24pOwogICAgICAgIGludCBsaWN6bmlrPXN0b2kodGVtcC5zdWJzdHIocG9zaXRpb24rMSx0ZW1wLnNpemUoKS1wb3NpdGlvbikpOwogICAgICAgIHN0cmluZyBwYXR0ZXJuVGVtcDsKICAgICAgICBmb3IgKGludCBpPTA7IGk8bGljem5pazsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcGF0dGVyblRlbXArPXRlbXBXb3JkKyIgIjsKICAgICAgICB9CiAgICAgICAgcGF0dGVyblRlbXAucG9wX2JhY2soKTsKICAgICAgICBzdHI9cmVnZXhfcmVwbGFjZShzdHIscGF0dGVybiwgcGF0dGVyblRlbXAsIHJlZ2V4X2NvbnN0YW50czo6Zm9ybWF0X2ZpcnN0X29ubHkpOwogICAgfQogICAgcmV0dXJuIHN0cjsKfQoKaW50IG1haW4oKQp7CiAgICBzdHJpbmcgY2hvb3NlOwogICAgZ2V0bGluZShjaW4sY2hvb3NlKTsKICAgIGlmIChjaG9vc2U9PSJLT01QUkVTSkEiKQogICAgewogICAgICAgIHN0cmluZyBsaW5lLHN0cjsKICAgICAgICB3aGlsZSAoZ2V0bGluZShjaW4sbGluZSkgJiYgbGluZSE9IiIpCiAgICAgICAgewogICAgICAgICAgICBpZiAobGluZVtsaW5lLnNpemUoKS0xXT09JyAnKSBzdHIrPWxpbmU7CiAgICAgICAgICAgIGVsc2Ugc3RyKz1saW5lKyIgIjsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cltzdHIuc2l6ZSgpLTFdPT0nICcpIHN0ci5wb3BfYmFjaygpOwogICAgICAgIHJlZ2V4IGxldHRlcl9wYXR0ZXJuKCIoW2Etel0pXFwxezMsfSIpOwogICAgICAgIHN0cj1MZXR0ZXJSZXBsYWNlTWF0Y2hlcyhzdHIsbGV0dGVyX3BhdHRlcm4pOwogICAgICAgIHJlZ2V4IHdvcmRfcGF0dGVybiAoIihbYS16XVxcYikoXFxzXFwxXFxiKXsyLH18KFsqYS16MC05XXsyLH1cXGIpKFxcc1xcM1xcYikrIik7CiAgICAgICAgc3RyPVdvcmRSZXBsYWNlTWF0Y2hlcyhzdHIsd29yZF9wYXR0ZXJuKTsKICAgICAgICBjb3V0PDxzdHI7CiAgICB9CiAgICBlbHNlIGlmIChjaG9vc2U9PSJERUtPTVBSRVNKQSIpCiAgICB7CiAgICAgICAgc3RyaW5nIGxpbmUsc3RyOwogICAgICAgIHdoaWxlIChnZXRsaW5lKGNpbixsaW5lKSAmJiBsaW5lIT0iIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChsaW5lW2xpbmUuc2l6ZSgpLTFdPT0nICcpIHN0cis9bGluZTsKICAgICAgICAgICAgZWxzZSBzdHIrPWxpbmUrIiAiOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyW3N0ci5zaXplKCktMV09PScgJykgc3RyLnBvcF9iYWNrKCk7CiAgICAgICAgcmVnZXggbGV0dGVyX3BhdHRlcm4oIlthLXpdezF9XFwqXFxkKyIpOwogICAgICAgIHN0cj1EZWNvbXBfTGV0dGVyUmVwbGFjZU1hdGNoZXMoc3RyLGxldHRlcl9wYXR0ZXJuKTsKICAgICAgICByZWdleCB3b3JkX3BhdHRlcm4gKCJcXHcrXFwvXFxkKyIpOwogICAgICAgIHN0cj1EZWNvbXBfV29yZFJlcGxhY2VNYXRjaGVzKHN0cix3b3JkX3BhdHRlcm4pOwogICAgICAgIGNvdXQ8PHN0cjsKICAgIH0KICAgIHJldHVybiAwOwp9