結果

問題 No.2283 Prohibit Three Consecutive
ユーザー buey_tbuey_t
提出日時 2023-04-29 12:09:40
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 535 ms / 2,000 ms
コード長 2,933 bytes
コンパイル時間 150 ms
コンパイル使用メモリ 82,368 KB
実行使用メモリ 190,268 KB
最終ジャッジ日時 2024-11-18 09:39:58
合計ジャッジ時間 5,874 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 139 ms
89,164 KB
testcase_01 AC 139 ms
89,376 KB
testcase_02 AC 145 ms
89,400 KB
testcase_03 AC 456 ms
169,424 KB
testcase_04 AC 535 ms
184,300 KB
testcase_05 AC 439 ms
94,004 KB
testcase_06 AC 433 ms
92,856 KB
testcase_07 AC 140 ms
89,420 KB
testcase_08 AC 473 ms
190,268 KB
testcase_09 AC 302 ms
138,192 KB
testcase_10 AC 320 ms
142,984 KB
testcase_11 AC 320 ms
143,068 KB
testcase_12 AC 387 ms
92,840 KB
testcase_13 AC 530 ms
94,628 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

from math import sqrt,sin,cos,tan,ceil,radians,floor,gcd,exp,log,log10,log2,factorial,fsum
from heapq import heapify, heappop, heappush
from bisect import bisect_left, bisect_right
from copy import deepcopy
import copy
import random
from random import randrange
from collections import deque,Counter,defaultdict
from itertools import permutations,combinations
from decimal import Decimal,ROUND_HALF_UP
#tmp = Decimal(mid).quantize(Decimal('0'), rounding=ROUND_HALF_UP)
from functools import lru_cache, reduce
#@lru_cache(maxsize=None)
from operator import add,sub,mul,xor,and_,or_,itemgetter
import sys
input = sys.stdin.readline
# .rstrip()
INF = 10**18
mod1 = 10**9+7
mod2 = 998244353

#DecimalならPython
#再帰ならPython!!!!!!!!!!!!!!!!!!!!!!!!!!


'''
dpだとは思う
直前の二個を記録すればいいかな
1周回ってきたときに、最初の?をなにで解釈したか考えないといけない
最初の?が1じゃないとダメなとき、11が後ろにあったらダメ

'''

def solve(N,S):
    dp = [[[0]*2 for _ in range(2)] for _ in range(N+1)]
    for i in range(2):
        for j in range(2):
            dp[0][i][j] = 1
    
    for i in range(1,N+1):
        if S[i-1] == '0':
            dp[i][1][0] = max(dp[i][1][0], dp[i-1][0][1], dp[i-1][1][1])
            dp[i][0][0] = max(dp[i][0][0], dp[i-1][1][0])
        elif S[i-1] == '1':
            dp[i][0][1] = max(dp[i][j][1], dp[i-1][0][0], dp[i-1][1][0])
            dp[i][1][1] = dp[i-1][0][1]
        else:
            dp[i][0][0] = max(dp[i][0][0], dp[i-1][1][0])
            dp[i][1][1] = max(dp[i][1][1], dp[i-1][0][1])
            dp[i][1][0] = max(dp[i][1][0], dp[i-1][0][1], dp[i-1][1][1])
            dp[i][0][1] = max(dp[i][0][1], dp[i-1][1][0], dp[i-1][0][0])
    
    f = 0
    if dp[N][1][1] == 1:
        if dp[2][0][0] == 1 or dp[2][0][1] == 1:
            f = 1
    if dp[N][0][0] == 1:
        if dp[2][1][1] == 1 or dp[2][1][0] == 1:
            f = 1
    if dp[N][1][0] == 1:
        if dp[2][1][1] == 1 or dp[2][1][0] == 1 or dp[2][0][1] == 1:
            f = 1
    if dp[N][0][1] == 1:
        if dp[2][0][0] == 1 or dp[2][1][0] == 1 or dp[2][0][1] == 1:
            f = 1
    
    return f

for _ in range(int(input())):
    N = int(input())
    S = list(input().rstrip())
    
    ans = 0
    
    if S[0] == '?':
        if S[1] == '?':
            for i in range(2):
                for j in range(2):
                    S[0] = str(i)
                    S[1] = str(j)
                    ans = max(ans,solve(N,S))
        else:
            for i in range(2):
                S[0] = str(i)
                ans = max(ans,solve(N,S))
    else:
        if S[1] == '?':
            for i in range(2):
                S[1] = str(i)
                ans = max(ans,solve(N,S))
        else:
            ans = max(ans,solve(N,S))
    
    if ans:
        print('Yes')
    else:
        print('No')

























0