Submission #20432101
Source Code Expand
// https://atcoder.jp/contests/arc113/tasks/arc113_e
//
#![allow(unused_imports)]
use std::io::*;
use std::io::Write;
use std::fmt::*;
use std::str::*;
use std::cmp::*;
use std::collections::*;
// Input macros.
// Original by tanakh: https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8
#[allow(unused_macros)]
macro_rules! input {
(source = $s:expr, $($r:tt)*) => {
let mut iter = $s.split_whitespace();
input_inner!{iter, $($r)*}
};
($($r:tt)*) => {
let s = {
use std::io::Read;
let mut s = String::new();
std::io::stdin().read_to_string(&mut s).unwrap();
s
};
let mut iter = s.split_whitespace();
input_inner!{iter, $($r)*}
};
}
#[allow(unused_macros)]
macro_rules! input_inner {
($iter:expr) => {};
($iter:expr, ) => {};
($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
let $var = read_value!($iter, $t);
input_inner!{$iter $($r)*}
};
($iter:expr, mut $var:ident : $t:tt $($r:tt)*) => {
let mut $var = read_value!($iter, $t);
input_inner!{$iter $($r)*}
};
}
#[allow(unused_macros)]
macro_rules! read_value {
($iter:expr, ( $($t:tt),* )) => {
( $(read_value!($iter, $t)),* )
};
($iter:expr, [ $t:tt ; $len:expr ]) => {
(0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
};
($iter:expr, [ next / $t:tt ]) => {
{
let len = read_value!($iter, usize);
(0..len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
}
};
($iter:expr, switch) => {
{
let ty = read_value!($iter, i32);
if ty == 1 {
vec![ty, read_value!($iter, i32), read_value!($iter, i32)]
} else if ty == 2 {
vec![ty, read_value!($iter, i32)]
} else {
vec![ty, read_value!($iter, i32)]
}
}
};
($iter:expr, chars) => {
read_value!($iter, String).chars().collect::<Vec<char>>()
};
($iter:expr, usize1) => {
read_value!($iter, usize) - 1
};
($iter:expr, $t:ty) => {
$iter.next().unwrap().parse::<$t>().expect("Parse error")
};
}
#[allow(unused_macros)]
macro_rules! read_line {
($t:tt) => {
{
let mut s = String::new();
std::io::stdin().read_line(&mut s).unwrap();
s.trim_right().parse::<$t>().unwrap()
}
}
}
#[allow(unused_macros)]
macro_rules! dvec {
($t:expr ; $len:expr) => {
vec![$t; $len]
};
($t:expr ; $len:expr, $($rest:expr),*) => {
vec![dvec!($t; $($rest),*); $len]
};
}
#[allow(unused_macros)]
macro_rules! ifv {
($t:expr, $a:expr, $b: expr) => {
if $t { $a } else { $b }
}
}
#[allow(unused_macros)]
macro_rules! fill {
($t:expr, $v:expr) => {
for i in 0..$t.len() {
$t[i] = $v;
}
};
}
#[allow(unused_macros)]
macro_rules! join {
($t:expr, $glue:expr) => {
$t.into_iter().map(|w| w.to_string()).collect::<Vec<_>>().join($glue)
};
}
#[allow(unused_macros)]
macro_rules! debug {
($($a:expr),*) => {
eprintln!(concat!($(stringify!($a), " = {:?}, "),*), $($a),*);
}
}
// ===
fn solve(query: Vec<char>) -> Vec<char> {
let n = query.len();
let mut an = 0;
let mut cont_an = 0;
let mut a_grp = vec![];
for i in 0..n {
if query[i] == 'a' {
an += 1;
cont_an += 1;
} else {
if cont_an >= 1 {
a_grp.push((cont_an, i-cont_an));
cont_an = 0;
}
}
}
if cont_an >= 1 {
a_grp.push((cont_an, n-cont_an-1));
}
if an == n {
return vec!['a'; n];
}
let mut tail_a = 0;
for i in (0..n).rev() {
if query[i] == 'a' {
tail_a += 1;
} else {
break;
}
}
let mut head_a = 0;
for i in 0..n {
if query[i] == 'a' {
head_a += 1;
} else {
break;
}
}
let mut ret = vec!['b'; n-an];
// must not delete 'b'
if tail_a >= 1 {
let mut append = 0;
let mut glue = 0;
for &(c, pos) in &a_grp {
if c >= 2 {
append += c;
glue += 1;
}
}
if tail_a == 1 {
append += 1;
glue += 1;
}
if append % 2 != an % 2 {
append += 1;
glue += 1;
}
append -= 2 * (glue - 1);
for i in 0..append {
ret.push('a');
}
return ret;
}
if an % 2 == 0 {
return vec!['b'; n-an];
} else {
if head_a == an {
let mut ret = vec!['b'; 1+(n-an)];
ret[0] = 'a';
return ret;
}
if n >= 2 && query[n-2] == 'a' {
let mut ret = vec!['b'; 1+(n-an)];
let rn = ret.len();
ret[rn-2] = 'a';
return ret;
}
if n >= 3 && query[n-3] == 'a' {
let mut ret = vec!['b'; 1+(n-an)];
let rn = ret.len();
ret[rn-3] = 'a';
return ret;
}
let mut best = (0, 0);
for &(c, pos) in &a_grp {
if pos != 0 && best.0 < c {
best = (c, pos);
}
}
// debug!(query, a_grp, best);
assert!(best.0 >= 1 && query[best.1-1] == 'b');
let last_a = best.1;
assert!(last_a >= 1);
let mut q2 = vec!['-'; n-2];
for i in 0..last_a-1 {
q2[i] = query[i];
}
let mut w = last_a-1;
for i in (last_a..n-1).rev() {
q2[w] = query[i];
w += 1;
}
assert!(w == n-2);
return solve(q2);
// bbbbbbbbbbbbbbbbbbaaa
// bbbbbbbbbbbbbbbbbba
// bbbaaabbbabbbabbbabbabbbb
// ^ ^
// bbbbbbbbbbbbbbbbbbaaa
//
// vec!['-'; n]
}
}
fn main() {
input! {
t: usize,
testcases: [chars; t]
};
for query in testcases {
println!("{}", join!(solve(query), ""));
}
}
Submission Info
Submission Time
2021-02-23 11:27:54+0900
Task
E - Rvom and Rsrev
User
hamadu
Language
Rust (1.42.0)
Score
800
Code Size
6518 Byte
Status
AC
Exec Time
49 ms
Memory
13976 KiB
Compile Error
warning: unused variable: `pos`
--> src/main.rs:189:18
|
189 | for &(c, pos) in &a_grp {
| ^^^ help: consider prefixing with an underscore: `_pos`
|
= note: `#[warn(unused_variables)]` on by default
warning: unused variable: `i`
--> src/main.rs:204:13
|
204 | for i in 0..append {
| ^ help: consider prefixing with an underscore: `_i`
Judge Result
Set Name
Sample
All
Score / Max Score
0 / 0
800 / 800
Status
Set Name
Test Cases
Sample
s1.txt
All
01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, 32.txt, 33.txt, 34.txt, 35.txt, 36.txt, 37.txt, 38.txt, 39.txt, 40.txt, 41.txt, 42.txt, 43.txt, 44.txt, 45.txt, s1.txt
Case Name
Status
Exec Time
Memory
01.txt
AC
28 ms
2632 KiB
02.txt
AC
49 ms
3764 KiB
03.txt
AC
35 ms
3364 KiB
04.txt
AC
31 ms
3248 KiB
05.txt
AC
21 ms
3000 KiB
06.txt
AC
19 ms
3068 KiB
07.txt
AC
27 ms
3048 KiB
08.txt
AC
20 ms
3064 KiB
09.txt
AC
20 ms
2996 KiB
10.txt
AC
20 ms
3368 KiB
11.txt
AC
33 ms
8464 KiB
12.txt
AC
27 ms
9284 KiB
13.txt
AC
24 ms
9948 KiB
14.txt
AC
30 ms
9784 KiB
15.txt
AC
32 ms
12896 KiB
16.txt
AC
30 ms
12512 KiB
17.txt
AC
32 ms
13944 KiB
18.txt
AC
33 ms
13976 KiB
19.txt
AC
27 ms
9448 KiB
20.txt
AC
24 ms
9316 KiB
21.txt
AC
29 ms
7872 KiB
22.txt
AC
21 ms
7896 KiB
23.txt
AC
26 ms
7972 KiB
24.txt
AC
21 ms
7812 KiB
25.txt
AC
19 ms
7796 KiB
26.txt
AC
5 ms
3172 KiB
27.txt
AC
23 ms
7408 KiB
28.txt
AC
28 ms
9344 KiB
29.txt
AC
27 ms
9648 KiB
30.txt
AC
26 ms
10032 KiB
31.txt
AC
30 ms
9916 KiB
32.txt
AC
28 ms
10744 KiB
33.txt
AC
32 ms
12656 KiB
34.txt
AC
34 ms
13928 KiB
35.txt
AC
28 ms
13912 KiB
36.txt
AC
23 ms
9284 KiB
37.txt
AC
23 ms
9216 KiB
38.txt
AC
20 ms
7908 KiB
39.txt
AC
20 ms
7988 KiB
40.txt
AC
19 ms
7884 KiB
41.txt
AC
23 ms
7836 KiB
42.txt
AC
19 ms
7768 KiB
43.txt
AC
25 ms
10684 KiB
44.txt
AC
21 ms
6884 KiB
45.txt
AC
26 ms
9380 KiB
s1.txt
AC
1 ms
2112 KiB