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