B. Flip the Bits | Round #712 Div.2


https://codeforces.com/contest/1504/problem/B
1秒、256 MBメモリ
input :
  • t (1 ≤ t ≤ 104)
  • n (1 ≤ n ≤ 3⋅105)
  • a b(長さn、符号0と符号1からなる)
  • output :
  • For each test case, output "YES"if it is possible to transform a into b, or "NO"if it is impossible. You can print each letter in any case (upper or lower).
    a文字列をbに設定できる場合、YESがない場合はNOを出力します.
  • 条件:
  • There is a binary string a of length n. In one operation, you can select any prefix of a with an equal number of 0 and 1 symbols. Then all symbols in the prefix are inverted: each 0 becomes 1 and each 1 becomes 0.
    バイナリ形式で構成された文aが存在する.演算を実行するときは、1と0の数が等しい接頭辞を選択し、この部分を構成する0については、1を1、0で置き換えます.
  • 後ろからずっと違う場所を見つけて、ひっくり返そうとした.そうすると、コードも長くなり、複雑さに時間がかかります.別の方法が必要です.

    交換が必要


    交換が必要な場合を考えます.
    接頭辞セクションの現在のインデックスの文字が異なる場合は、置換する必要があります.でも今の位置は今の位置+1が違うと?現在の位置の接頭辞に反転し、+1で反転した場合にのみ元のシェイプが得られます.
    このような状況を考慮すべきだ.

    スワップ


    このようにインデックスを表示する場合

    このような形態を保つには,交換を行う.でもこの時交換できる条件を満たさないと?できません.
    boolean値を使用して計算します.
    import sys
    
    t = int(sys.stdin.readline())
    for _ in range(t):
        n = int(sys.stdin.readline())
        a = list(sys.stdin.readline().rstrip())
        b = list(sys.stdin.readline().rstrip())
        a.append('1')
        b.append('1')
        cnt, flag = 0, 0
    
        for i in range(n):
            cnt += (a[i] == '1') - (a[i] == '0')
    
            if ((a[i] == b[i]) != (a[i + 1] == b[i + 1])) and cnt != 0:
                flag = 1
                break
    
        print("NO" if flag else "YES")
    最後に同じ値を追加することで、計算がより便利になります.