Module d

Expand description

§ABC 411 D - Conflict 2

refs: https://atcoder.jp/contests/abc411/tasks/abc411_d

文字列は随時完全置き換えされるため, 最後にサーバを書き換えた PC, その PC に保存されている文字列, と後ろから探索を行えばよい.

use proconio::input;

const SERVER: usize = 0;

enum Query {
    FromServer(usize),
    AppendToPC(usize, String),
    ToServer(usize),
}

fn main() {
    input! {
        _: usize, q: usize,
    }

    let mut queries = (0..q)
        .map(|_| {
            input! { t: usize }
            match t {
                1 => {
                    input! { p: usize }
                    Query::FromServer(p)
                }
                2 => {
                    input! { p: usize, c: String }
                    Query::AppendToPC(p, c)
                }
                3 => {
                    input! { p: usize }
                    Query::ToServer(p)
                }
                _ => unreachable!(),
            }
        })
        .collect::<Vec<_>>();
    queries.reverse();

    let mut stack = vec![];

    let mut ptr = SERVER;

    for query in queries {
        match query {
            Query::FromServer(p) if ptr == p => {
                ptr = SERVER;
            }
            Query::ToServer(p) if ptr == SERVER => {
                ptr = p;
            }
            Query::AppendToPC(p, c) if ptr == p => {
                stack.push(c);
            }
            _ => {}
        }
    }

    stack.reverse();
    println!("{}", stack.join(""));
}