const std:: set < std:: string > badwords =
{
"jebac" ,
"jeban" ,
"kurw" ,
"korwa" ,
"pierdol" ,
"pierdal" ,
"huj" ,
"choj" ,
"pizd" ,
"kutas" ,
"fuck" ,
"cipa" ,
"pedale" ,
"szmato" ,
"szmata" ,
"szmaty" ,
"szmatko" ,
"szmatka" ,
"szmatki" ,
"zajebie" ,
"zjeb" ,
"suka" ,
"suko" ,
"suki"
} ;
const std:: vector < std:: string > badword_sizes =
{
"" ,
"*" ,
"**" ,
"***" ,
"****" ,
"*****" ,
"******" ,
"*******" ,
"********" ,
"*********" ,
"**********" ,
"***********" ,
"************" ,
"*************" ,
"**************" ,
"***************"
} ;
const std:: vector < std:: pair < std:: string ,std:: string >> PolishReplacement =
{
{ "ł" , "l" } ,
{ "ą" , "a" } ,
{ "ę" , "e" } ,
{ "ć" , "c" } ,
{ "ż" , "z" } ,
{ "ź" , "z" } ,
{ "ó" , "o" } ,
{ "ś" , "s" } ,
{ "ń" , "n" }
} ;
void FilterBadWords( std:: string & s)
{
std:: string str_copy( s) ;
for ( auto replace : PolishReplacement)
boost:: ireplace_all ( str_copy, replace.first , replace.second ) ;
for ( auto & badword : badwords)
{
size_t pos = str_copy.find ( badword) ;
size_t size;
while ( pos ! = std:: string :: npos )
{
size = badword.size ( ) ;
s.replace ( pos, pos + size, badword_sizes[ size] ) ;
str_copy.replace ( pos, pos + size, badword_sizes[ size] ) ;
pos = str_copy.find ( badword) ;
}
}
}
//input: Ty jebany pierdolony chuju szmata pierdolona kurwo kurwa
//output: Ty *****ierdolony c***rwo ****
//expected output: Ty *****y *******ony c***u ****** *******ona ****o ****a
Y29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGJhZHdvcmRzID0gCnsgCgkiamViYWMiLAoJImplYmFuIiwKCSJrdXJ3IiwKCSJrb3J3YSIsCgkicGllcmRvbCIsCgkicGllcmRhbCIsCgkiaHVqIiwKCSJjaG9qIiwKCSJwaXpkIiwKCSJrdXRhcyIsCgkiZnVjayIsCgkiY2lwYSIsCgkicGVkYWxlIiwKCSJzem1hdG8iLAoJInN6bWF0YSIsCgkic3ptYXR5IiwKCSJzem1hdGtvIiwKCSJzem1hdGthIiwKCSJzem1hdGtpIiwKCSJ6YWplYmllIiwKCSJ6amViIiwKCSJzdWthIiwKCSJzdWtvIiwKCSJzdWtpIgp9OwoKY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGJhZHdvcmRfc2l6ZXMgPQp7CgkiIiwKCSIqIiwKCSIqKiIsCgkiKioqIiwKCSIqKioqIiwKCSIqKioqKiIsCgkiKioqKioqIiwKCSIqKioqKioqIiwKCSIqKioqKioqKiIsCgkiKioqKioqKioqIiwKCSIqKioqKioqKioqIiwKCSIqKioqKioqKioqKiIsCgkiKioqKioqKioqKioqIiwKCSIqKioqKioqKioqKioqIiwKCSIqKioqKioqKioqKioqKiIsCgkiKioqKioqKioqKioqKioqIgp9OwoKY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLHN0ZDo6c3RyaW5nPj4gUG9saXNoUmVwbGFjZW1lbnQgPQp7Cgl7ICLFgiIsICJsIiB9LAoJeyAixIUiLCAiYSIgfSwKCXsgIsSZIiwgImUiIH0sCgl7ICLEhyIsICJjIiB9LAoJeyAixbwiLCAieiIgfSwKCXsgIsW6IiwgInoiIH0sCgl7ICLDsyIsICJvIiB9LAoJeyAixZsiLCAicyIgfSwKCXsgIsWEIiwgIm4iIH0KfTsKCnZvaWQgRmlsdGVyQmFkV29yZHMoc3RkOjpzdHJpbmcmIHMpCnsKCXN0ZDo6c3RyaW5nIHN0cl9jb3B5KHMpOwoJZm9yIChhdXRvIHJlcGxhY2UgOiBQb2xpc2hSZXBsYWNlbWVudCkKCQlib29zdDo6aXJlcGxhY2VfYWxsKHN0cl9jb3B5LCByZXBsYWNlLmZpcnN0LCByZXBsYWNlLnNlY29uZCk7CgoJZm9yIChhdXRvICZiYWR3b3JkIDogYmFkd29yZHMpCgl7CgkJc2l6ZV90IHBvcyA9IHN0cl9jb3B5LmZpbmQoYmFkd29yZCk7CgkJc2l6ZV90IHNpemU7CgkJd2hpbGUgKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykKCQl7CgkJCXNpemUgPSBiYWR3b3JkLnNpemUoKTsKCgkJCXMucmVwbGFjZShwb3MsIHBvcyArIHNpemUsIGJhZHdvcmRfc2l6ZXNbc2l6ZV0pOwoJCQlzdHJfY29weS5yZXBsYWNlKHBvcywgcG9zICsgc2l6ZSwgYmFkd29yZF9zaXplc1tzaXplXSk7CgoJCQlwb3MgPSBzdHJfY29weS5maW5kKGJhZHdvcmQpOwoJCX0KCX0KfQoKLy9pbnB1dDogVHkgamViYW55IHBpZXJkb2xvbnkgY2h1anUgc3ptYXRhIHBpZXJkb2xvbmEga3Vyd28ga3Vyd2EKLy9vdXRwdXQ6IFR5ICoqKioqaWVyZG9sb255IGMqKipyd28gKioqKgovL2V4cGVjdGVkIG91dHB1dDogVHkgKioqKip5ICoqKioqKipvbnkgYyoqKnUgKioqKioqICoqKioqKipvbmEgKioqKm8gKioqKmEK