Official

A - 暗号化リレー / Encryption Relay Editorial by admin

DeepSeek V3

概要

この問題は、N台のサーバーを経由するXOR暗号化リレーにおいて、特定の条件(サンドイッチ検知)で一部のサーバーが暗号化キーを0として扱う場合の最終出力を求める問題です。

考察

問題の核心は、「連続する3台のサーバーi, i+1, i+2について、Ai = A{i+2} かつ Ai ≠ A{i+1} のとき、サーバーi+1はキーA_{i+1}の代わりに0を使用する」という特殊ルールの処理です。

素朴なアプローチとして、各サーバーでのXOR計算をシミュレートしながら、各ステップでサンドイッチ条件をチェックする方法が考えられます。しかし、この条件はサーバーi+1の処理時に、前後のサーバーiとi+2のキー値に依存するため、単純な順次処理では条件判定が困難です。

重要な観察は、サンドイッチ条件が発生するのは「中央のサーバー」のみであり、両端のサーバー1とサーバーNは影響を受けないことです。また、条件判定は各サーバーi(1 < i < N)について、その前後(i-1とi+1)のキー値を確認すれば良いことです。

アルゴリズム

  1. サーバー1では常にキーA_0を使用してXOR計算を行う
  2. サーバー2からサーバーN-1までについて、各サーバーiで:
    • 条件「A[i-1] == A[i+1] かつ A[i-1] ≠ A[i]」をチェック
    • 条件が真なら0とXOR、偽ならA[i]とXOR
  3. サーバーNでは常にキーA[N-1]を使用してXOR計算を行う

このアルゴリズムでは、各サーバーでの処理が独立しており、前後のキー値のみを参照するため、効率的に処理できます。

計算量

  • 時間計算量: \(O(N)\)
    • N台のサーバーに対して1回のループで処理するため
  • 空間計算量: \(O(N)\)
    • キー配列Aを保持するためのメモリ

実装のポイント

  • 境界条件の処理:N=1の場合は特別扱いが必要(サーバー1のみで前後のサーバーがないため)

  • 配列インデックスの扱い:Pythonでは0-indexedなので、サーバーiはA[i-1]に対応

  • 条件判定の順序:まずA[i-1]とA[i+1]の等価性を確認し、次にA[i-1]とA[i]の非等価性を確認

  • 効率性:各サーバーでの処理が定数時間で完了するため、大規模な入力にも対応可能

    ソースコード

import sys

def main():
    data = list(map(int, sys.stdin.read().split()))
    if not data:
        return
    
    N = data[0]
    X = data[1]
    A = data[2:2+N]
    
    if N == 1:
        print(X ^ A[0])
        return
        
    result = X
    result ^= A[0]
    
    for i in range(1, N-1):
        if A[i-1] == A[i+1] and A[i-1] != A[i]:
            result ^= 0
        else:
            result ^= A[i]
            
    result ^= A[N-1]
    print(result)

if __name__ == "__main__":
    main()

この解説は deepseekv3 によって生成されました。

posted:
last update: