English version is in beta. All contents of the site should be already translated (mostly using machine translation), and everything should work properly. However, if you find any problems, please contact me.

Разбор задачи "Смайлики", читать только тем, кто решил!

Во-первых, в этой задаче надо правильно понять условие, например, понять, что на тест ;:-()[] ответ 1, т.к. эта строка содержит один смайлик — :-(. Т.е. не страшно, если вокруг смайлика есть лишние символы, важно, что сам смайлик можно выделить.

Дальше эту задачу можно решать по-разному. Можно, конечно, идти по строке, искать двоеточие или точку с запятой, после нее искать минусы, после нее — одинаковые скобки. Это можно написать, но это не очень просто (хотя и не суперсложно).

Можно немного упростить решение, поняв, что не надо искать много одинаковых скобок, хватит и одной, т.к. если есть смайлик с кучей скобок, то если убрать все скобки, кроме последней, то он тоже останется смайликом.

Но можно и еще более упростить решение, сделав одно простое наблюдение. Если выкинуть из входного файла все минусы, то ответ не изменится! Действительно, смайлик без минусов — это тоже смайлик, и наоборот, если в смайлик без минусов вставить минусы, то получится все равно смайлик. Поэтому от выкидывания минусов не появится новых смайликов, а старые не пропадут.

Поэтому очень простое решение этой задачи — выкинем все минусы, а после этого посчитаем, сколько в строке встречается пар соседних символов таких, что первый из них — это : или ;, а второй — скобка.