結果
| 問題 |
No.3171 Color Restoration
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-06-07 03:53:08 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,338 bytes |
| コンパイル時間 | 16,115 ms |
| コンパイル使用メモリ | 398,360 KB |
| 実行使用メモリ | 7,844 KB |
| 最終ジャッジ日時 | 2025-06-07 03:53:26 |
| 合計ジャッジ時間 | 13,639 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 WA * 3 |
ソースコード
use std::collections::HashMap;
use std::fmt::Debug;
use std::io;
use std::str::FromStr;
struct Scanner<R, W>
where
R: io::BufRead,
W: io::Write,
{
reader: R,
writer: W,
#[allow(dead_code)]
buffer: Vec<String>,
}
impl<R: io::BufRead, W: io::Write> Scanner<R, W> {
fn new(reader: R, writer: W) -> Self
where
R: io::BufRead,
W: io::Write,
{
Self {
reader,
writer,
buffer: Vec::new(),
}
}
#[allow(dead_code)]
fn next<T: std::str::FromStr>(&mut self) -> T {
loop {
if let Some(token) = self.buffer.pop() {
return token.parse().ok().expect("Failed parse");
}
let mut input = String::new();
self.reader.read_line(&mut input).expect("Failed read");
self.buffer = input.split_whitespace().rev().map(String::from).collect();
}
}
#[allow(dead_code)]
fn next_vec<T: std::str::FromStr>(&mut self) -> Vec<T>
where
<T as FromStr>::Err: Debug,
{
let mut input = String::new();
self.reader.read_line(&mut input).expect("Failed read");
input
.split_whitespace()
.rev()
.map(|x| x.parse::<T>().unwrap())
.collect()
}
}
fn solve<R: io::BufRead, W: io::Write>(scan: &mut Scanner<R, W>) {
let records = vec![
vec![
"gray", "brown", "green", "cyan", "blue", "yellow", "orange", "red",
],
vec!["gray", "green", "cyan", "blue", "yellow", "red"],
vec!["gray", "green", "cyan", "blue", "violet", "orange", "red"],
];
let mut sets = HashMap::new();
for i in records[0].iter() {
for j in records[1].iter() {
for k in records[2].iter() {
let mut a = vec![
i.to_owned().to_owned(),
j.to_owned().to_owned(),
k.to_owned().to_owned(),
];
a.sort_by(|a, b| a.cmp(&b));
sets.entry(a)
.and_modify(|x: &mut usize| {
*x += 1;
})
.or_insert(1);
}
}
}
let mut input = scan.next_vec::<String>();
input.sort_by(|a, b| a.cmp(&b));
if let Some(x) = sets.get(&input) {
if x == &1 {
writeln!(scan.writer, "Yes").ok();
} else {
writeln!(scan.writer, "No").ok();
}
} else {
writeln!(scan.writer, "No").ok();
}
}
fn main() {
let stdin = io::stdin();
let stdout = &mut io::BufWriter::new(io::stdout());
let mut scan = Scanner::new(stdin.lock(), stdout);
solve(&mut scan);
}
#[cfg(test)]
mod tests {
use super::*;
fn get_output(input: &[u8]) -> String {
let stdout = Vec::new();
let mut scan = Scanner::new(&input[..], stdout);
solve(&mut scan);
let output = String::from_utf8(scan.writer).expect("what?");
let output = output.trim();
output.to_string()
}
#[test]
fn case_0() {
let output = get_output(b"gray green blue");
assert_eq!(output, "No".to_owned());
}
#[test]
fn case_1() {
let output = get_output(b"violet red orange");
assert_eq!(output, "Yes".to_owned());
}
#[test]
fn case_2() {
let output = get_output(b"red red red");
assert_eq!(output, "Yes".to_owned());
}
#[test]
fn case_3() {
let output = get_output(b"brown gray gray");
assert_eq!(output, "Yes".to_owned());
}
#[test]
fn case_4() {
let output = get_output(b"cyan cyan brown");
assert_eq!(output, "Yes".to_owned());
}
#[test]
fn case_5() {
let output = get_output(b"violet yellow yellow");
assert_eq!(output, "Yes".to_owned());
}
#[test]
fn case_6() {
let output = get_output(b"violet blue blue");
assert_eq!(output, "Yes".to_owned());
}
#[test]
fn case_7() {
let output = get_output(b"orange cyan yellow");
assert_eq!(output, "No".to_owned());
}
#[test]
fn case_8() {
let output = get_output(b"brown brown brown");
assert_eq!(output, "No".to_owned());
}
}