結果

問題 No.517 壊れたアクセサリー
ユーザー tubo28
提出日時 2017-05-30 17:15:00
言語 Rust
(1.83.0 + proconio)
結果
AC  
実行時間 1 ms / 2,000 ms
コード長 6,642 bytes
コンパイル時間 11,768 ms
コンパイル使用メモリ 384,488 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-09-21 19:22:38
合計ジャッジ時間 12,936 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 15
権限があれば一括ダウンロードができます
コンパイルメッセージ
warning: creating a mutable reference to mutable static is discouraged
   --> src/main.rs:154:36
    |
154 |                 match stdin().read(&mut buf) {
    |                                    ^^^^^^^^ mutable reference to mutable static
    |
    = note: for more information, see issue #114447 <https://github.com/rust-lang/rust/issues/114447>
    = note: this will be a hard error in the 2024 edition
    = note: this mutable reference has lifetime `'static`, but if the static gets accessed (read or written) by any other means, or any other reference is created, then any further use of this mutable reference is Undefined Behavior
    = note: `#[warn(static_mut_refs)]` on by default
help: use `addr_of_mut!` instead to create a raw pointer
    |
154 |                 match stdin().read(addr_of_mut!(buf)) {
    |                                    ~~~~~~~~~~~~~~~~~

ソースコード

diff #
プレゼンテーションモードにする

#[macro_use]
#[allow(dead_code, unused_macros, non_upper_case_globals)]
mod io {
macro_rules! p {
($x:expr) => {
println!("{}", $x);
};
($x:expr, $($y:expr),+) => {
print!("{} ", $x);
p!($($y),+);
};
}
macro_rules! dump {
($($a:expr),+) => {{
if USE_DUMP {
use std::io::*;
write!(stderr(), "{}:{}\t", file!(), line!()).unwrap();
dump!(A $($a),+);
write!(stderr(), " = ").unwrap();
dump!(B $($a),+);
writeln!(stderr(), "").unwrap();
}
}};
(A $x:expr) => {
write!(stderr(), "{}", stringify!($x)).unwrap();
};
(A $x:expr, $($y:expr),+) => {
write!(stderr(), "{}, ", stringify!($x)).unwrap();
dump!(A $($y),+);
};
(B $x:expr) => {
write!(stderr(), "{:?}", $x).unwrap();
};
(B $x:expr, $($y:expr),+) => {
write!(stderr(), "{:?}, ", $x).unwrap();
dump!(B $($y),+);
};
}
pub trait Scan<T> {
fn scan() -> T;
}
macro_rules! scan_primitive {
($t: ty) => {
impl Scan<$t> for $t {
fn scan() -> $t {
get_word().expect("EOF?").parse()
.unwrap_or_else(|e| panic!("Cannot parse {}", e))
}
}
};
($t: ty, $($u: ty),+) => {
scan_primitive!($t);
scan_primitive!($($u),+);
};
}
macro_rules! scan_tuple {
($($t: ident),*) => {
impl< $($t: Scan<$t>),* > Scan< ( $($t),* ) > for ( $($t),* ) {
fn scan() -> ( $($t),* ) {
( $( $t::scan()),* )
}
}
};
}
scan_primitive!(u8,
u16,
u32,
u64,
i8,
i16,
i32,
i64,
f32,
f64,
usize,
isize,
bool,
String);
scan_tuple!(A, B);
scan_tuple!(A, B, C);
scan_tuple!(A, B, C, D);
pub fn get<T: Scan<T>>() -> T {
T::scan()
}
pub fn get_vec<T: Scan<T>>(n: usize) -> Vec<T> {
(0..n).map(|_| get()).collect()
}
pub fn get_mat<T: Scan<T>>(r: usize, c: usize) -> Vec<Vec<T>> {
(0..r).map(|_| get_vec(c)).collect()
}
pub fn get_vec_char() -> Vec<char> {
get_word().unwrap().chars().collect()
}
pub fn get_mat_char(h: usize) -> Vec<Vec<char>> {
(0..h).map(|_| get_vec_char()).collect()
}
pub fn get_line() -> String {
get_line_wrapped().unwrap()
}
fn get_word() -> Option<String> {
let mut res = String::with_capacity(16);
while let Some(c) = get_u8() {
let d = c as char;
if !d.is_whitespace() {
res.push(d);
} else if res.len() != 0 {
unget_u8(c);
break;
}
}
if res.len() == 0 { None } else { Some(res) }
}
pub fn get_line_wrapped() -> Option<String> {
let c = get_u8();
if c.is_none() {
return None;
}
let mut line = String::with_capacity(20);
line.push(c.unwrap() as char);
loop {
let c = get_u8();
if c.is_none() || c.unwrap() == b'\n' {
// C++
// if c.is_some() {
// self.unget_u8(b'\n');
// }
return Some(line);
}
line.push(c.unwrap() as char);
}
}
static mut idx: usize = 0;
static mut len: usize = 0;
static mut buf: [u8; 65536] = [0; 65536];
fn get_u8() -> Option<u8> {
unsafe {
use std::io::{stdin, Read};
if idx == len {
match stdin().read(&mut buf) {
Ok(l) if l > 0 => {
idx = 0;
len = l;
}
_ => return None,
}
}
idx += 1;
Some(buf[idx - 1])
}
}
fn unget_u8(c: u8) {
unsafe {
idx -= 1;
buf[idx] = c;
}
}
pub fn has_next() -> bool {
loop {
let c = get_u8();
if c.is_none() {
return false;
}
let c = c.unwrap();
if !(c as char).is_whitespace() {
unget_u8(c);
return true;
}
}
}
pub const USE_DUMP: bool = true;
}
use io::*;
fn main() {
while has_next() {
let f = || {
let mut size = 0;
let mut next = [26; 26];
let mut cs = vec![];
let n = get();
for _ in 0..n {
let s = get_vec_char().iter()
.map(|c| *c as usize - b'A' as usize).collect::<Vec<_>>();
for i in 1..s.len() {
next[s[i-1]] = s[i]
}
for &c in s.iter() {
cs.push(c);
}
size += s.len();
}
(size, next, cs)
};
let mut ok = true;
let (sz1, next1, cs1) = f();
let (sz2, next2, cs2) = f();
let mut cs = cs1.iter().chain(cs2.iter()).collect::<Vec<_>>();
cs.sort();
cs.dedup();
ok &= sz1 == sz2;
let next = (0..26).map(|i| {
if next1[i] == 26 {
next2[i]
} else if next2[i] == 26 {
next1[i]
} else if next1[i] == next2[i] {
next1[i]
} else {
ok = false;
100
}
}).collect::<Vec<_>>();
let mut out = false;
if ok {
for &x in cs.iter() {
let mut res = vec![];
let mut c = *x;
while c != 26 {
res.push(c);
c = next[c];
}
if res.len() == sz1 {
p!(res.iter().map(|c| (*c + b'A' as usize) as u8 as char)
.collect::<String>());
out = true;
}
}
//dump!(res);
}
if !ok || !out {
p!(-1);
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0