| Codeforces Round 1012 (Div. 1) |
|---|
| Закончено |
В C++ условный оператор ?: используется так: значение x?y:z равно $$$y$$$, если $$$x$$$ истинно; в противном случае значение равно $$$z$$$. $$$x$$$, $$$y$$$ и $$$z$$$ также могут быть выражениями. Он ассоциативен справа; то есть a?b:c?d:e эквивалентно a?b:(c?d:e). $$$0$$$ означает ложь, а $$$1$$$ означает истину.
Дана двоичная строка длиной $$$2n+1$$$, необходимо показать, может ли значение выражения быть $$$1$$$ после вставки $$$n$$$ условных операторов в строку. Вы можете использовать скобки. Например, строку 10101 можно преобразовать в (1?0:1)?0:1, значение которой равно $$$1$$$.
Первая строка содержит одно целое число $$$t$$$ ($$$1 \le t \le 10\,000)$$$, количество наборов входных данных. Далее следует их описание.
В первой строке набора входных данных содержится одно целое число $$$n$$$ ($$$1 \le n \le 1.5 \cdot 10^5)$$$.
Во второй строке каждого набора входных данных записана двоичная строка длины $$$2n + 1$$$.
Гарантируется, что сумма $$$n$$$ по всем наборам входных данных не превосходит $$$1.5 \cdot 10^5$$$).
Для каждого набора входных данных в первой строке выведите Yes, если строку можно преобразовать в выражение со значением $$$1$$$; в противном случае выведите No.
Если ответ Yes, выведите выражение во второй строке. Вы можете использовать скобки, но порядок символов в исходной строке должен оставаться прежним. Длина вашего выражения не должна превышать $$$10n+1000$$$.
2210101200000
Yes (1?0:1)?(0):1 No
Первый набор входных данных — это тот, который упоминается в описании задачи.
Во втором наборе входных данных очевидно, что независимо от того, как использовать условный оператор, результат всегда будет нулем.
| Название |
|---|


