結果

問題 No.470 Inverse S+T Problem
ユーザー hatoohatoo
提出日時 2017-10-19 20:18:38
言語 Rust
(1.72.1)
結果
WA  
実行時間 -
コード長 4,836 bytes
コンパイル時間 5,605 ms
コンパイル使用メモリ 158,252 KB
実行使用メモリ 7,488 KB
最終ジャッジ日時 2023-08-24 01:31:25
合計ジャッジ時間 3,689 ms
ジャッジサーバーID
(参考情報)
judge13 / judge14
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,380 KB
testcase_01 AC 1 ms
4,376 KB
testcase_02 AC 1 ms
4,380 KB
testcase_03 AC 1 ms
4,376 KB
testcase_04 AC 1 ms
4,380 KB
testcase_05 AC 1 ms
4,376 KB
testcase_06 AC 20 ms
7,488 KB
testcase_07 AC 19 ms
7,456 KB
testcase_08 AC 20 ms
7,432 KB
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 AC 1 ms
4,380 KB
testcase_13 WA -
testcase_14 WA -
testcase_15 AC 1 ms
4,376 KB
testcase_16 AC 1 ms
4,380 KB
testcase_17 WA -
testcase_18 AC 1 ms
4,376 KB
testcase_19 WA -
testcase_20 AC 1 ms
4,376 KB
testcase_21 AC 1 ms
4,376 KB
testcase_22 AC 1 ms
4,380 KB
testcase_23 AC 1 ms
4,376 KB
testcase_24 AC 1 ms
4,376 KB
testcase_25 AC 1 ms
4,376 KB
testcase_26 AC 1 ms
4,380 KB
testcase_27 AC 1 ms
4,376 KB
testcase_28 AC 3 ms
4,376 KB
testcase_29 AC 1 ms
4,380 KB
testcase_30 AC 2 ms
4,380 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
warning: unnecessary parentheses around type
   --> Main.rs:118:12
    |
118 |     let n: (usize) = util::get();
    |            ^     ^
    |
    = note: `#[warn(unused_parens)]` on by default
help: remove these parentheses
    |
118 -     let n: (usize) = util::get();
118 +     let n: usize = util::get();
    |

warning: 1 warning emitted

ソースコード

diff #

#[allow(unused_imports)]
use std::cmp::{max, min, Ordering};
#[allow(unused_imports)]
use std::collections::{HashMap, HashSet};

mod util {
    use std::io::stdin;
    use std::str::FromStr;
    use std::fmt::Debug;

    #[allow(dead_code)]
    pub fn line() -> String {
        let mut line: String = String::new();
        stdin().read_line(&mut line).unwrap();
        line.trim().to_string()
    }

    #[allow(dead_code)]
    pub fn get<T: FromStr>() -> T
    where
        <T as FromStr>::Err: Debug,
    {
        let mut line: String = String::new();
        stdin().read_line(&mut line).unwrap();
        line.trim().parse().unwrap()
    }

    #[allow(dead_code)]
    pub fn gets<T: FromStr>() -> Vec<T>
    where
        <T as FromStr>::Err: Debug,
    {
        let mut line: String = String::new();
        stdin().read_line(&mut line).unwrap();
        line.split_whitespace()
            .map(|t| t.parse().unwrap())
            .collect()
    }

    #[allow(dead_code)]
    pub fn get2<T: FromStr, U: FromStr>() -> (T, U)
    where
        <T as FromStr>::Err: Debug,
        <U as FromStr>::Err: Debug,
    {
        let mut line: String = String::new();
        stdin().read_line(&mut line).unwrap();
        let mut iter = line.split_whitespace();
        (
            iter.next().unwrap().parse().unwrap(),
            iter.next().unwrap().parse().unwrap(),
        )
    }

    #[allow(dead_code)]
    pub fn get3<S: FromStr, T: FromStr, U: FromStr>() -> (S, T, U)
    where
        <S as FromStr>::Err: Debug,
        <T as FromStr>::Err: Debug,
        <U as FromStr>::Err: Debug,
    {
        let mut line: String = String::new();
        stdin().read_line(&mut line).unwrap();
        let mut iter = line.split_whitespace();
        (
            iter.next().unwrap().parse().unwrap(),
            iter.next().unwrap().parse().unwrap(),
            iter.next().unwrap().parse().unwrap(),
        )
    }
}

// std::cmp::Reverse doesn't have Clone.
#[derive(Eq, PartialEq, Clone)]
struct Rev<T>(pub T);

impl<T: PartialOrd> PartialOrd for Rev<T> {
    fn partial_cmp(&self, other: &Rev<T>) -> Option<Ordering> {
        other.0.partial_cmp(&self.0)
    }
}

impl<T: Ord> Ord for Rev<T> {
    fn cmp(&self, other: &Rev<T>) -> Ordering {
        other.0.cmp(&self.0)
    }
}

#[allow(unused_macros)]
macro_rules! debug {
    ($x: expr) => {
        println!("{}: {:?}", stringify!($x), $x)
    }
}

fn dfs(v: usize, edges: &[Vec<usize>], used: &mut [bool], vs: &mut Vec<usize>) {
    used[v] = true;
    for &to in &edges[v] {
        if !used[to] {
            dfs(to, edges, used, vs);
        }
    }
    vs.push(v);
}

fn rdfs(v: usize, k: usize, edges_rev: &[Vec<usize>], used: &mut [bool], cmp: &mut [usize]) {
    used[v] = true;
    cmp[v] = k;

    for &to in &edges_rev[v] {
        if !used[to] {
            rdfs(to, k, edges_rev, used, cmp);
        }
    }
}

fn main() {
    let n: (usize) = util::get();
    let u: Vec<Vec<char>> = (0..n).map(|_| util::line().chars().collect()).collect();

    if n > 52 {
        println!("Impossible");
        return;
    }

    let mut edges = vec![Vec::new(); 2 * n];
    let mut edges_rev = vec![Vec::new(); 2 * n];

    for i in 0..n - 1 {
        let ui = &u[i];
        for k in i + 1..n {
            let uk = &u[k];
            for x in 1..3 {
                for y in 1..3 {
                    if ui[..x] == uk[..y] || ui[..x] == uk[y..] || ui[x..] == uk[..y] ||
                        ui[x..] == uk[y..]
                    {
                        let vi = [n + i, i][x - 1];
                        let vk = [k, k + n][y - 1];

                        edges[vi].push(vk);
                        edges_rev[vk].push(vi);

                        let vi = [n, i + n][x - 1];
                        let vk = [k + n, k][y - 1];

                        edges[vk].push(vi);
                        edges_rev[vi].push(vk);
                    }
                }
            }
        }
    }
    // debug!(edges);

    let mut used = vec![false; 2 * n];
    let mut vs = Vec::new();
    for v in 0..n {
        if !used[v] {
            dfs(v, &edges, &mut used, &mut vs);
        }
    }
    let mut k = 0;
    used = vec![false; 2 * n];
    // let mut cmp = vec![0; 2 * n];
    let mut cmp = (0..2 * n).collect::<Vec<_>>();

    for &v in vs.iter().rev() {
        if !used[v] {
            rdfs(v, k, &edges_rev, &mut used, &mut cmp);
            k += 1;
        }
    }

    for i in 0..n {
        if cmp[i] == cmp[i + n] {
            println!("Impossible");
            return;
        }
    }

    for i in 0..n {
        if cmp[i] > cmp[i + n] {
            println!("{} {}", &u[i][..2].iter().collect::<String>(), u[i][2]);
        } else {
            println!("{} {}", &u[i][0], u[i][1..].iter().collect::<String>());
        }
    }
}
0