考虑逆向思维,很容易想到可以优先从后面删掉0
(操作B的逆向操作),然后如果前面是0
则删掉它并将序列翻转(操作A的逆向操作),一直重复这两个步骤直到字符串为空。如果中途无法操作,输出No
,否则输出Yes
。
下面我们来证明这个方法的正确性:
No
,但正确答案为Yes
;代码实现时,没有必要真正翻转序列,只需记录当前翻转的状态(或),记为,则实际的(其中为输入的,表示异或/XOR
操作)。
删除时可以使用deque
或者数组端点记录。
#include <cstdio>
#define maxn 200005
using namespace std;
bool a[maxn];
int main()
{
int n = 0;
char c;
while((c = getchar()) != '\n')
n = (n << 3) + (n << 1) + (c ^ 48);
for(int i=0; i<n; i++, getchar())
a[i] = getchar() ^ 48;
bool flipped = false;
for(int l=0, r=n-1; a[l]==flipped; flipped^=1, l++)
while(!a[r] ^ flipped)
if(l > --r)
return puts("Yes"), 0;
puts("No");
return 0;
}