Submission #60108583


Source Code Expand

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


fn to_index(c: char) -> usize {
    match c {
        '/' => 0,
        '1' => 1,
        '2' => 2,
        _ => unreachable!(),
    }
}

fn judge(v: &Vec<Vec<usize>>, m: usize, l: usize, r: usize) -> bool {
    /* 長さ2*m+1の部分文字列があるか */
    let mut idx = l;
    if m != 0 {
        let k = v[1].lower_bound(idx);
        if k + m - 1 >= v[1].len() {
            return false;
        }
        idx = v[1][k + m - 1];
    }

    {
        let k = v[0].lower_bound(idx);
        if k >= v[0].len() {
            return false;
        }
        idx = v[0][k];
    }

    if m != 0 {
        let k = v[2].lower_bound(idx);
        if k + m - 1 >= v[2].len() {
            return false;
        }
        idx = v[2][k + m - 1];
    }

    if idx <= r {
        true
    } else {
        false
    }

}

fn main() {
    input!{
        n: usize,
        q: usize,
        s: Chars,
    }


    let mut v = vec![vec![]; 3];
    for (i, &c) in s.iter().enumerate() {
        v[to_index(c)].push(i);
    }
    dbg!(&v);

    for _ in 0..q {
        input! {
            l: Usize1,
            r: Usize1,
        }

        let mut ok = !0;
        let mut ng = r-l+1;

        while ng.wrapping_sub(ok) > 1 {
            let m = ng.wrapping_add(ok) / 2;
            if judge(&v, m, l, r) {
                ok = m;
            } else {
                ng = m;
            }
        }
        if ok == !0 {
            println!("0");
        } else {
            println!("{}", ok * 2 + 1);
        }
    }
}


pub trait VecLibs<T: std::cmp::Ord> {
    fn lower_bound(&self, elm: T) -> usize;
    fn upper_bound(&self, elm: T) -> usize;
}

impl<T: std::cmp::Ord> VecLibs<T> for Vec<T> {
    fn lower_bound(&self, elm: T) -> usize {
        let mut left = 0;
        let mut right = self.len();
        while left < right {
            let mid = (left + right) / 2;
            if self[mid] < elm {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        left
    }

    fn upper_bound(&self, elm: T) -> usize {
        let mut left = 0;
        let mut right = self.len();
        while left < right {
            let mid = (left + right) / 2;
            if self[mid] <= elm {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        left
    }
}

Submission Info

Submission Time
Task E - 11/22 Subsequence
User ardRiriy
Language Rust (rustc 1.70.0)
Score 500
Code Size 2573 Byte
Status AC
Exec Time 674 ms
Memory 4980 KiB

Compile Error

warning: unused import: `itertools::Itertools`
 --> src/main.rs:1:5
  |
1 | use itertools::Itertools;
  |     ^^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused variable: `n`
  --> src/main.rs:51:9
   |
51 |         n: usize,
   |         ^ help: if this is intentional, prefix it with an underscore: `_n`
   |
   = note: `#[warn(unused_variables)]` on by default

Judge Result

Set Name Sample All after_contest
Score / Max Score 0 / 0 500 / 500 0 / 0
Status
AC × 1
AC × 25
AC × 2
Set Name Test Cases
Sample 00_sample_00.txt
All 00_sample_00.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 02_corner_00.txt, 02_corner_01.txt, 02_corner_02.txt, 02_corner_03.txt
after_contest 99_after_contest_00.txt, 99_after_contest_01.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 1972 KiB
01_random_00.txt AC 672 ms 4896 KiB
01_random_01.txt AC 482 ms 3832 KiB
01_random_02.txt AC 650 ms 4860 KiB
01_random_03.txt AC 565 ms 4212 KiB
01_random_04.txt AC 674 ms 4980 KiB
01_random_05.txt AC 504 ms 4012 KiB
01_random_06.txt AC 618 ms 4772 KiB
01_random_07.txt AC 335 ms 3576 KiB
01_random_08.txt AC 645 ms 4860 KiB
01_random_09.txt AC 539 ms 4024 KiB
01_random_10.txt AC 538 ms 4288 KiB
01_random_11.txt AC 480 ms 3816 KiB
01_random_12.txt AC 635 ms 4968 KiB
01_random_13.txt AC 576 ms 4396 KiB
01_random_14.txt AC 613 ms 4564 KiB
01_random_15.txt AC 404 ms 3892 KiB
01_random_16.txt AC 648 ms 4768 KiB
01_random_17.txt AC 474 ms 3840 KiB
01_random_18.txt AC 574 ms 4472 KiB
01_random_19.txt AC 403 ms 3972 KiB
02_corner_00.txt AC 461 ms 4752 KiB
02_corner_01.txt AC 92 ms 2456 KiB
02_corner_02.txt AC 88 ms 2528 KiB
02_corner_03.txt AC 88 ms 2260 KiB
99_after_contest_00.txt AC 428 ms 4252 KiB
99_after_contest_01.txt AC 477 ms 4668 KiB