#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
// Liste der bekannten Substrings
const std:: map < int , std:: vector < std:: string >> mTeilstrings = {
{ 1 , { "[8A]" , "[UKE]" } } ,
{ 2 , { "[Dings da]" , "[DingsBums]" } } ,
{ 3 , { "[GF]" , "[MOD]" , "[MOD3]" , "[MOD6]" } } ,
{ 4 , { "[Weiss]" , "[Rot]" , "[Orange-Blau]" } }
} ;
auto parse_line( std:: string line,
const std:: map < int , std:: vector < std:: string >> & substring_groups)
{
std:: vector < std:: pair < std:: string , int >> result;
for ( auto const & kv : substring_groups)
{
for ( auto const & substring: kv.second )
{
std:: string :: size_type pos = 0 ;
while ( ( pos = line.find ( substring, pos) ) ! = std:: string :: npos )
{
result.push_back ( std:: make_pair ( substring, kv.first ) ) ;
pos + = substring.length ( ) ;
}
}
}
return result;
}
std:: string reconstitute_line( std:: vector < std:: pair < std:: string , int >> const & substring_pairs)
{
std:: string result;
int last_group;
if ( not substring_pairs.empty ( ) )
{
last_group = substring_pairs[ 0 ] .second ;
result = substring_pairs[ 0 ] .first ;
}
for ( std:: size_t i = 1 ; i < substring_pairs.size ( ) ; ++ i)
{
int current_group = substring_pairs[ i] .second ;
if ( current_group == last_group)
return "Zeile enthält illegale Doppelungen" ;
result + = substring_pairs[ i] .first ;
}
return result;
}
int main( )
{
for ( std:: string line; std:: getline ( std:: cin , line) ; )
{
auto substring_pairs = parse_line( line, mTeilstrings) ;
std:: sort ( substring_pairs.begin ( ) , substring_pairs.end ( ) ,
[ ] ( auto left_pair, auto right_pair) { return left_pair.second > right_pair.second ; } ) ;
std:: string sorted_line = reconstitute_line( substring_pairs) ;
std:: cout << "Zeile \" " << line << "\" wird sortiert zu \" " << sorted_line << "\" \n " ;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKLy8gTGlzdGUgZGVyIGJla2FubnRlbiBTdWJzdHJpbmdzCmNvbnN0IHN0ZDo6bWFwPGludCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiBtVGVpbHN0cmluZ3MgPSB7CiAgICB7MSwgeyJbOEFdIiwgIltVS0VdIn19LAogICAgezIsIHsiW0RpbmdzIGRhXSIsICJbRGluZ3NCdW1zXSJ9fSwKICAgIHszLCB7IltHRl0iLCAiW01PRF0iLCAiW01PRDNdIiwgIltNT0Q2XSJ9fSwKICAgIHs0LCB7IltXZWlzc10iLCAiW1JvdF0iLCAiW09yYW5nZS1CbGF1XSJ9fQp9OwoKCmF1dG8gcGFyc2VfbGluZShzdGQ6OnN0cmluZyBsaW5lLCAKCSAgIAkJICAgY29uc3Qgc3RkOjptYXA8aW50LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+ICZzdWJzdHJpbmdfZ3JvdXBzKQp7CglzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4+IHJlc3VsdDsKCWZvciAoYXV0byBjb25zdCYga3YgOiBzdWJzdHJpbmdfZ3JvdXBzKQoJewoJCWZvciAoYXV0byBjb25zdCAmc3Vic3RyaW5nOiAga3Yuc2Vjb25kKQoJCXsKCQkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOwoJCQl3aGlsZSAoKHBvcyA9IGxpbmUuZmluZChzdWJzdHJpbmcsIHBvcykpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSAKCQkJewoJCQkJcmVzdWx0LnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihzdWJzdHJpbmcsIGt2LmZpcnN0KSk7CgkJCQlwb3MgKz0gc3Vic3RyaW5nLmxlbmd0aCgpOwoJCQl9CgkJfQoJfQoJcmV0dXJuIHJlc3VsdDsKfQoKc3RkOjpzdHJpbmcgcmVjb25zdGl0dXRlX2xpbmUoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQ+PiBjb25zdCYgc3Vic3RyaW5nX3BhaXJzKQp7CglzdGQ6OnN0cmluZyByZXN1bHQ7CglpbnQgbGFzdF9ncm91cDsKCWlmIChub3Qgc3Vic3RyaW5nX3BhaXJzLmVtcHR5KCkpCgl7CgkJbGFzdF9ncm91cCA9IHN1YnN0cmluZ19wYWlyc1swXS5zZWNvbmQ7CgkJcmVzdWx0ID0gc3Vic3RyaW5nX3BhaXJzWzBdLmZpcnN0OwoJfQoJZm9yIChzdGQ6OnNpemVfdCBpID0gMTsgaSA8IHN1YnN0cmluZ19wYWlycy5zaXplKCk7ICsraSkKCXsKCQlpbnQgY3VycmVudF9ncm91cCA9IHN1YnN0cmluZ19wYWlyc1tpXS5zZWNvbmQ7CgkJaWYgKGN1cnJlbnRfZ3JvdXAgPT0gbGFzdF9ncm91cCkKCQkJcmV0dXJuICJaZWlsZSBlbnRow6RsdCBpbGxlZ2FsZSBEb3BwZWx1bmdlbiI7CgkJcmVzdWx0ICs9IHN1YnN0cmluZ19wYWlyc1tpXS5maXJzdDsKCX0KCXJldHVybiByZXN1bHQ7Cn0KCmludCBtYWluKCkKewoJZm9yKHN0ZDo6c3RyaW5nIGxpbmU7IHN0ZDo6Z2V0bGluZShzdGQ6OmNpbiwgbGluZSk7KQoJewoJCWF1dG8gc3Vic3RyaW5nX3BhaXJzID0gcGFyc2VfbGluZShsaW5lLCBtVGVpbHN0cmluZ3MpOwoJCXN0ZDo6c29ydChzdWJzdHJpbmdfcGFpcnMuYmVnaW4oKSwgc3Vic3RyaW5nX3BhaXJzLmVuZCgpLCAKCQkgICAgICAgICAgW10oYXV0byBsZWZ0X3BhaXIsIGF1dG8gcmlnaHRfcGFpcil7cmV0dXJuIGxlZnRfcGFpci5zZWNvbmQgPiByaWdodF9wYWlyLnNlY29uZDt9KTsKCQlzdGQ6OnN0cmluZyBzb3J0ZWRfbGluZSA9IHJlY29uc3RpdHV0ZV9saW5lKHN1YnN0cmluZ19wYWlycyk7CgkJc3RkOjpjb3V0IDw8ICJaZWlsZSBcIiIgPDwgbGluZSA8PCAiXCIgd2lyZCBzb3J0aWVydCB6dSBcIiIgPDwgc29ydGVkX2xpbmUgPDwgIlwiXG4iOwoJfQp9