提出 #19087694


ソースコード 拡げる

use std::collections::BTreeMap;

const MASK_30: u64 = (1 << 30) - 1;
const MASK_31: u64 = (1 << 31) - 1;
const MOD: u64 = (1 << 61) - 1;
const BASE: u64 = 1e9 as u64 + 7;

fn main() {
    let (r, w) = (std::io::stdin(), std::io::stdout());
    let mut sc = IO::new(r.lock(), w.lock());

    let n: usize = sc.read();
    let k: usize = sc.read();
    let s: Vec<usize> = sc
        .read::<String>()
        .chars()
        .map(|c| c as usize - 'a' as usize)
        .collect();
    let mut base = vec![1; 26];
    for i in 1..26 {
        base[i] = mod_mul(base[i - 1], BASE);
    }

    let mut sum = 0;
    for i in 0..k {
        sum += base[s[i]];
        sum %= MOD;
    }

    let mut sum_hash = vec![sum];
    for i in k..n {
        sum += base[s[i]];
        sum += MOD - base[s[i - k]];
        sum %= MOD;
        sum_hash.push(sum);
    }

    let mut sum_count = BTreeMap::new();
    for i in 0..(n - k + 1) {
        if i >= k {
            *sum_count.entry(sum_hash[i - k]).or_insert(0) += 1;
        }
        let sum_cur = sum_count.get(&sum_hash[i]).cloned().unwrap_or(0);
        if sum_cur > 0 {
            println!("YES");
            return;
        }
    }
    println!("NO");
}

fn mod_mul(a: u64, b: u64) -> u64 {
    let (a_prefix, a_suffix) = (a >> 31, a & MASK_31);
    let (b_prefix, b_suffix) = (b >> 31, b & MASK_31);
    let m = a_suffix * b_prefix + a_prefix * b_suffix;
    modulo(a_prefix * b_prefix * 2 + (m >> 30) + ((m & MASK_30) << 31) + a_suffix * b_suffix)
}

fn modulo(v: u64) -> u64 {
    let v = (v & MOD) + (v >> 61);
    if v >= MOD {
        v - MOD
    } else {
        v
    }
}

pub struct IO<R, W: std::io::Write>(R, std::io::BufWriter<W>);

impl<R: std::io::Read, W: std::io::Write> IO<R, W> {
    pub fn new(r: R, w: W) -> Self {
        Self(r, std::io::BufWriter::new(w))
    }
    pub fn write<S: ToString>(&mut self, s: S) {
        use std::io::Write;
        self.1.write_all(s.to_string().as_bytes()).unwrap();
    }
    pub fn read<T: std::str::FromStr>(&mut self) -> T {
        use std::io::Read;
        let buf = self
            .0
            .by_ref()
            .bytes()
            .map(|b| b.unwrap())
            .skip_while(|&b| b == b' ' || b == b'\n' || b == b'\r' || b == b'\t')
            .take_while(|&b| b != b' ' && b != b'\n' && b != b'\r' && b != b'\t')
            .collect::<Vec<_>>();
        unsafe { std::str::from_utf8_unchecked(&buf) }
            .parse()
            .ok()
            .expect("Parse error.")
    }
    pub fn vec<T: std::str::FromStr>(&mut self, n: usize) -> Vec<T> {
        (0..n).map(|_| self.read()).collect()
    }
    pub fn chars(&mut self) -> Vec<char> {
        self.read::<String>().chars().collect()
    }
}

提出情報

提出日時
問題 C - だれじゃ
ユーザ kenkoooo
言語 Rust (1.42.0)
得点 100
コード長 2832 Byte
結果 AC
実行時間 46 ms
メモリ 5600 KiB

ジャッジ結果

セット名 Sample Subtask1 Subtask2 Subtask3 Subtask4
得点 / 配点 0 / 0 15 / 15 15 / 15 15 / 15 55 / 55
結果
AC × 3
AC × 18
AC × 33
AC × 48
AC × 63
セット名 テストケース
Sample subtask0_sample-01.txt, subtask0_sample-02.txt, subtask0_sample-03.txt
Subtask1 subtask0_sample-01.txt, subtask0_sample-02.txt, subtask0_sample-03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt
Subtask2 subtask0_sample-01.txt, subtask0_sample-02.txt, subtask0_sample-03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt, subtask2_13.txt, subtask2_14.txt, subtask2_15.txt
Subtask3 subtask0_sample-01.txt, subtask0_sample-02.txt, subtask0_sample-03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt, subtask2_13.txt, subtask2_14.txt, subtask2_15.txt, subtask3_01.txt, subtask3_02.txt, subtask3_03.txt, subtask3_04.txt, subtask3_05.txt, subtask3_06.txt, subtask3_07.txt, subtask3_08.txt, subtask3_09.txt, subtask3_10.txt, subtask3_11.txt, subtask3_12.txt, subtask3_13.txt, subtask3_14.txt, subtask3_15.txt
Subtask4 subtask0_sample-01.txt, subtask0_sample-02.txt, subtask0_sample-03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt, subtask2_13.txt, subtask2_14.txt, subtask2_15.txt, subtask3_01.txt, subtask3_02.txt, subtask3_03.txt, subtask3_04.txt, subtask3_05.txt, subtask3_06.txt, subtask3_07.txt, subtask3_08.txt, subtask3_09.txt, subtask3_10.txt, subtask3_11.txt, subtask3_12.txt, subtask3_13.txt, subtask3_14.txt, subtask3_15.txt, subtask4_01.txt, subtask4_02.txt, subtask4_03.txt, subtask4_04.txt, subtask4_05.txt, subtask4_06.txt, subtask4_07.txt, subtask4_08.txt, subtask4_09.txt, subtask4_10.txt, subtask4_11.txt, subtask4_12.txt, subtask4_13.txt, subtask4_14.txt, subtask4_15.txt
ケース名 結果 実行時間 メモリ
subtask0_sample-01.txt AC 7 ms 1992 KiB
subtask0_sample-02.txt AC 2 ms 2152 KiB
subtask0_sample-03.txt AC 2 ms 2088 KiB
subtask1_01.txt AC 2 ms 1912 KiB
subtask1_02.txt AC 2 ms 1960 KiB
subtask1_03.txt AC 2 ms 2140 KiB
subtask1_04.txt AC 2 ms 2120 KiB
subtask1_05.txt AC 2 ms 2072 KiB
subtask1_06.txt AC 2 ms 2084 KiB
subtask1_07.txt AC 2 ms 1992 KiB
subtask1_08.txt AC 2 ms 2092 KiB
subtask1_09.txt AC 2 ms 2124 KiB
subtask1_10.txt AC 2 ms 2092 KiB
subtask1_11.txt AC 1 ms 2164 KiB
subtask1_12.txt AC 2 ms 2084 KiB
subtask1_13.txt AC 2 ms 2040 KiB
subtask1_14.txt AC 2 ms 2064 KiB
subtask1_15.txt AC 2 ms 1984 KiB
subtask2_01.txt AC 4 ms 2040 KiB
subtask2_02.txt AC 2 ms 2108 KiB
subtask2_03.txt AC 2 ms 2096 KiB
subtask2_04.txt AC 2 ms 2144 KiB
subtask2_05.txt AC 1 ms 2048 KiB
subtask2_06.txt AC 2 ms 2180 KiB
subtask2_07.txt AC 1 ms 2176 KiB
subtask2_08.txt AC 3 ms 2076 KiB
subtask2_09.txt AC 2 ms 2064 KiB
subtask2_10.txt AC 2 ms 2092 KiB
subtask2_11.txt AC 2 ms 2076 KiB
subtask2_12.txt AC 2 ms 2100 KiB
subtask2_13.txt AC 2 ms 2112 KiB
subtask2_14.txt AC 2 ms 2148 KiB
subtask2_15.txt AC 2 ms 2096 KiB
subtask3_01.txt AC 2 ms 2076 KiB
subtask3_02.txt AC 2 ms 2120 KiB
subtask3_03.txt AC 2 ms 2184 KiB
subtask3_04.txt AC 2 ms 2104 KiB
subtask3_05.txt AC 2 ms 2064 KiB
subtask3_06.txt AC 2 ms 2024 KiB
subtask3_07.txt AC 2 ms 1976 KiB
subtask3_08.txt AC 6 ms 2112 KiB
subtask3_09.txt AC 6 ms 2312 KiB
subtask3_10.txt AC 3 ms 2116 KiB
subtask3_11.txt AC 2 ms 2188 KiB
subtask3_12.txt AC 2 ms 2088 KiB
subtask3_13.txt AC 2 ms 2112 KiB
subtask3_14.txt AC 9 ms 2200 KiB
subtask3_15.txt AC 3 ms 2140 KiB
subtask4_01.txt AC 2 ms 2292 KiB
subtask4_02.txt AC 6 ms 2468 KiB
subtask4_03.txt AC 2 ms 2380 KiB
subtask4_04.txt AC 5 ms 2496 KiB
subtask4_05.txt AC 7 ms 2536 KiB
subtask4_06.txt AC 33 ms 4260 KiB
subtask4_07.txt AC 25 ms 4392 KiB
subtask4_08.txt AC 8 ms 3740 KiB
subtask4_09.txt AC 46 ms 5600 KiB
subtask4_10.txt AC 9 ms 3792 KiB
subtask4_11.txt AC 33 ms 5120 KiB
subtask4_12.txt AC 11 ms 3480 KiB
subtask4_13.txt AC 27 ms 4272 KiB
subtask4_14.txt AC 9 ms 3396 KiB
subtask4_15.txt AC 7 ms 3456 KiB