結果
| 問題 |
No.470 Inverse S+T Problem
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-10-19 20:18:38 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,836 bytes |
| コンパイル時間 | 18,077 ms |
| コンパイル使用メモリ | 385,632 KB |
| 実行使用メモリ | 7,324 KB |
| 最終ジャッジ日時 | 2024-12-22 13:48:36 |
| 合計ジャッジ時間 | 13,414 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 20 WA * 7 |
コンパイルメッセージ
warning: unnecessary parentheses around type
--> src/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();
|
ソースコード
#[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>());
}
}
}