D. Backspace | Harbour.Space Scholarship Contest


https://codeforces.com/contest/1553/problem/D
2秒、256 MBメモリ
input :
  • q (1 ≤ q ≤ 105)
  • s (1 ≤ |s| ≤ 105)
  • t (1 ≤ |t| ≤ 105)
  • output :
  • For each test case, print "YES"if you can obtain the string t by typing the string s and replacing some characters with presses of "Backspace"button, or "NO"if you cannot.
    sを入力して削除してtを得ると「YES」が出力され、そうでなければ「NO」が出力される.
  • 条件:
  • When typing a character, instead of pressing the button corresponding to it, you can press the "Backspace"button. It deletes the last character you have typed among those that aren't deleted yet (or does nothing if there are no characters in the current string)
    同じ文字を入力しない場合は、「Backspace」と入力できます.これにより、これまでに入力した最後の文字が削除されます.
  • うるさいなあ.
    まず私の考え方を書いてください.

    同じ文字


    前から知り合って、tと同じ人から全員を確認して、もちろん正解が得られます.△もちろん、これは最大の失敗です.文章の長さを正しく考えていないので、もちろんタイムアウトが発生します.
    また、任意の文字を削除する場合は、次の文字までの間に存在する文字数は偶数でなければなりません.これでテキストを削除できます.
    この方法で問題を解決しようとしたが、失敗した.
    最初のコミットでは、変数自体の更新エラーが検出されました.

    異なるシステム


    最終的には,2つの入力文字列,targetを比較して移動する必要があるため,より目立つ名前で2ポインタを命名した.
    次にwhileゲートを介して移動する方法を用いた.しかも間違っています.
    他の人のコメントでは最後に残った文字の数を確認すると言っていました.
    私はこれを理解するのに30分もかかりましたが、他に何かあるのかとずっと考えていました.それから回って、これは最大の問題です.

    削除


    上に書いたように削除するには偶数が必要です.
    しかし、文の中でtargetは作られていて、残りが単数では文を作ることができません.全部削除できないからです.
    コードに追加します.タイムアウトが発生しました.
    減らそうと努力して、条件でやってみますが、だめです.そしてこのとき確認すると文字列の長さ自体が長い.前からすべての状況を確認したい完全探索は、もちろんだめです...

    n/a.妥協


    まず問題が正解したいので、他の人の解答を引用しました.Gredy方式で一番後ろからチェックを開始します.
    理解できない点がありますが、前の部分をどのように削除しますか.残りのメールのように、私は何かをすべきではないでしょうか.やったが違う.
    前の残りの文字については、「Backspace」を押し続けて入力しなくてもいいです.だから後ろから検査を始めるときにメリットがあります.
    しかし、これが正しいと思う理由があります.
    グリディ・ロフォード氏は、一番後ろに同じ文字が現れると削除され、順序が一致しない場合は例外が発生するかどうかを考えている.しかし、これらの状況はもともと「NO」の場合だった.後ろから来るなら、共通部分の文字列を探している感じでした.前から作るのに時間がかかったようです.
    他の人が見たら1番の繰り返し文で確認しますね...もう一度見たい
    import sys
    
    t = int(sys.stdin.readline())
    for _ in range(t):
        data = sys.stdin.readline().rstrip()
        target = sys.stdin.readline().rstrip()
        data_idx, target_idx = len(data) - 1, len(target) - 1
    
        while data_idx >= 0 and target_idx >= 0:
            if data[data_idx] == target[target_idx]:
                data_idx -= 1
                target_idx -= 1
                continue
    
            data_idx -= 2
    
        print("YES" if target_idx == -1 else "NO")