Submission #69856885


Source Code Expand

#![allow(unused_parens)]
#![allow(unused_imports)]
#![allow(non_upper_case_globals)]
#![allow(non_snake_case)]
#![allow(unused_mut)]
#![allow(unused_variables)]
#![allow(dead_code)]
#![allow(unused_macros)]

use itertools::Itertools;
use proconio::input;
use proconio::marker::{Chars, Usize1};

type Vec2<T> = Vec<Vec<T>>;
type Vec3<T> = Vec<Vec<Vec<T>>>;
#[rustfmt::skip]
macro_rules ! max { ( $x : expr ) => ( $x ) ; ( $x : expr , $ ( $xs : expr ) ,+ ) => { {  std :: cmp :: max ( $x , max! ( $ ( $xs ) ,+ ) ) } } ; }
#[rustfmt::skip]
macro_rules ! min { ( $x : expr ) => ( $x ) ; ( $x : expr , $ ( $xs : expr ) ,+ ) => { {  std :: cmp :: min ( $x , min! ( $ ( $xs ) ,+ ) ) } } ; }
#[rustfmt::skip]
macro_rules! chmin {    ($a:expr, $($b:expr),+) => {{        let d = min!($($b),+);        if $a > d {            $a = d;            true        } else {            false        }    }}; }

#[rustfmt::skip]
macro_rules! chmax {    ($a:expr, $($b:expr),+) => {{        let d = max!($($b),+);        if $a < d {            $a = d;            true        } else {            false        }    }};}

#[rustfmt::skip]
macro_rules! chadd {    ($a:expr, $b:expr) => {{        $a = $a + $b;    }};}
#[rustfmt::skip]
macro_rules! chsub {    ($a:expr, $b:expr) => {{        $a = $a - $b;    }};}
#[rustfmt::skip]
macro_rules! chmul {    ($a:expr, $b:expr) => {{        $a = $a * $b;    }};}

#[cfg(debug_assertions)]
macro_rules! mydbg {
    //($arg:expr) => (dbg!($arg))
    //($arg:expr) => (println!("{:?}",$arg));
      ($($a:expr),*) => {
          eprintln!(concat!($(stringify!($a), " = {:?}, "),*), $($a),*);
      }
}
#[cfg(not(debug_assertions))]
macro_rules! mydbg {
    ($($arg:expr),*) => {};
}

macro_rules! echo {
    ($($a:expr),*) => {
          $(println!("{}",$a))*
      }
}

macro_rules! multivec {
    ($a:expr;$b:expr) => {
        vec![$a; $b]
    };
    ($a:expr;$b:expr;$($c:expr);+) => {
        multivec![vec![$a;$b];$($c);+]
    };
}

use std::cmp::*;
use std::collections::*;
use std::ops::{Add, Div, Mul, Rem, Sub};

fn echoNoReturn() {
    echo!("No");
    std::process::exit(0);
}
fn echoYesReturn() {
    echo!("Yes");
    std::process::exit(0);
}

fn echoNo() {
    echo!("No");
}
fn echoYes() {
    echo!("Yes");
}

#[allow(dead_code)]
static INF_I64: i64 = 92233720368547758;
#[allow(dead_code)]
static INF_I32: i32 = 21474836;
#[allow(dead_code)]
static INF_USIZE: usize = 18446744073709551;
#[allow(dead_code)]
static M_O_D: usize = 1000000007;
#[allow(dead_code)]
static PAI: f64 = 3.1415926535897932;

trait IteratorExt: Iterator {
    fn toVec(self) -> Vec<Self::Item>;
}

impl<T: Iterator> IteratorExt for T {
    fn toVec(self) -> Vec<Self::Item> {
        self.collect()
    }
}

fn sin(a: f64) -> f64 {
    a.sin()
}
fn cos(a: f64) -> f64 {
    a.cos()
}
trait ToNum {
    fn toNum(&self) -> Vec<usize>;
}
impl ToNum for Vec<char> {
    fn toNum(&self) -> Vec<usize> {
        if self[0].is_ascii_digit() {
            self.iter().map(|x| x.toNumIndex()).toVec()
        } else {
            self.iter().map(|x| x.toAlphabetIndex()).toVec()
        }
    }
}

trait CharExt {
    fn toNum(&self) -> usize;
    fn toAlphabetIndex(&self) -> usize;
    fn toNumIndex(&self) -> usize;
}
impl CharExt for char {
    fn toNum(&self) -> usize {
        return *self as usize;
    }
    fn toAlphabetIndex(&self) -> usize {
        return self.toNum() - 'a' as usize;
    }
    fn toNumIndex(&self) -> usize {
        return self.toNum() - '0' as usize;
    }
}
trait PrimeNumber:
    Copy
    + Ord
    + Add<Output = Self>
    + Sub<Output = Self>
    + Mul<Output = Self>
    + Div<Output = Self>
    + Rem<Output = Self>
{
    fn is_odd(self) -> bool;
    fn is_even(self) -> bool;
    fn pow(self, exp: u32) -> Self;
}

macro_rules! impl_prim_int(($($ty:ty),*) => {
    $(
        impl PrimeNumber for $ty {
            fn pow(self, exp: u32) -> Self {
                self.pow(exp)
            }
            fn is_odd(self)->bool{
                self & 1==1
            }

            fn is_even(self)->bool{
                self & 1==0
            }
        }
    )*
});

trait SafeRangeContain {
    fn safe_contains(&self, x: i64) -> bool;
}

impl SafeRangeContain for std::ops::Range<usize> {
    fn safe_contains(&self, x: i64) -> bool {
        if x < 0 {
            return false;
        }
        return self.contains(&(x as usize));
    }
}

impl_prim_int!(u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize);
trait VectorExt {
    fn joinToString(&self, s: &str) -> String;
}
impl<T: ToString> VectorExt for Vec<T> {
    fn joinToString(&self, s: &str) -> String {
        return self
            .iter()
            .map(|x| x.to_string())
            .collect::<Vec<_>>()
            .join(s);
    }
}

trait StringExt {
    fn get_reverse(&self) -> String;
}
impl StringExt for String {
    fn get_reverse(&self) -> String {
        self.chars().rev().collect::<String>()
    }
}

trait UsizeExt {
    fn pow(&self, n: usize) -> usize;
}
impl UsizeExt for usize {
    fn pow(&self, n: usize) -> usize {
        return ((*self as u64).pow(n as u32)) as usize;
    }
}

use itertools_num::ItertoolsNum as _;
use superslice::*;

fn RunLengthEncode<T>(a: &[T]) -> (Vec<T>, Vec<usize>)
where
    T: PartialEq + Copy,
{
    let mut b = vec![];
    let mut c = vec![];
    for i in 0..a.len() {
        let k = a[i];
        if b.len() != 0 && b[b.len() - 1] == k {
            let i = c.len() - 1;
            c[i] += 1;
        } else {
            b.push(k);
            c.push(1);
        }
    }
    (b, c)
}

fn main() {
    input! {
       T: usize,
    }

    let mut ans = vec![];
    for _ in 0..T {
        ans.push(solve());
    }
    echo!(ans.joinToString("\n"));
}
fn solve() -> usize {
    input! {
        N:usize,
        S:Chars,
    }
    let S = S.toNum();
    let mut a = vec![0; N + 1]; //1
    for i in 0..N {
        a[i + 1] = a[i] + S[i];
    }
    let mut ans = usize::MAX;
    let b = RunLengthEncode(&S);
    let mut c = vec![];

    let mut l = 0;
    for i in 0..b.0.len() {
        c.push((b.0[i], l, l + b.1[i]));
        l += b.1[i];
    }
    a.push(a[N]);
    mydbg!(c);
    for &(s, l, r) in &c {
        if s == 0 {
            let x = a[l] - a[0];
            let x2 = a[N] - a[r];
            let y = l - x;
            let y2 = N - r - x2;
            let ret = x + x2 + (y + y2) * 2;
            mydbg!(ret, s, l, r, x, y, x2, y2);
            if chmin!(ans, ret) {}
        } else {
            let x = a[l] - a[0];
            let x2 = a[N] - a[r];
            let y = l - x;
            let y2 = N - r - x2;
            let ret = (x + x2) * 2 + (y + y2);
            mydbg!(ret, s, l, r, x, y, x2, y2);
            if chmin!(ans, ret) {}
        }
    }
    ans
}

Submission Info

Submission Time
Task D - Pop and Insert
User bqn
Language Rust (rustc 1.70.0)
Score 400
Code Size 6765 Byte
Status AC
Exec Time 21 ms
Memory 31860 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 1
AC × 14
Set Name Test Cases
Sample 00_sample_00.txt
All 00_sample_00.txt, 01_small_00.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 03_handmade_00.txt, 03_handmade_01.txt, 03_handmade_02.txt, 03_handmade_03.txt, 03_handmade_04.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 0 ms 1928 KiB
01_small_00.txt AC 21 ms 5040 KiB
02_random_00.txt AC 4 ms 2588 KiB
02_random_01.txt AC 5 ms 2984 KiB
02_random_02.txt AC 5 ms 5184 KiB
02_random_03.txt AC 6 ms 12240 KiB
02_random_04.txt AC 6 ms 12272 KiB
02_random_05.txt AC 8 ms 15464 KiB
02_random_06.txt AC 7 ms 13832 KiB
03_handmade_00.txt AC 7 ms 12328 KiB
03_handmade_01.txt AC 6 ms 12236 KiB
03_handmade_02.txt AC 15 ms 31860 KiB
03_handmade_03.txt AC 7 ms 12620 KiB
03_handmade_04.txt AC 7 ms 12208 KiB