結果
| 問題 | No.430 文字列検索 | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2019-05-07 07:35:01 | 
| 言語 | Rust (1.83.0 + proconio) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 758 ms / 2,000 ms | 
| コード長 | 1,582 bytes | 
| コンパイル時間 | 13,332 ms | 
| コンパイル使用メモリ | 380,120 KB | 
| 実行使用メモリ | 5,248 KB | 
| 最終ジャッジ日時 | 2024-11-10 00:25:12 | 
| 合計ジャッジ時間 | 21,155 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 14 | 
ソースコード
fn main() {
    use std::io::Read;
    let mut buf = String::new();
    std::io::stdin().read_to_string(&mut buf).unwrap();
    let mut iter = buf.split_whitespace();
    let s: String = iter.next().unwrap().parse::<String>().unwrap();
    let m: usize = iter.next().unwrap().parse::<usize>().unwrap();
    let mut cnt = 0;
    for _ in 0..m {
        let c: String = iter.next().unwrap().parse::<String>().unwrap();
        cnt += search_rh(s.as_bytes(), c.as_bytes()).len();
    }
    println!("{}", cnt);
}
#[doc = " O(len(base) + len(key))"]
#[allow(dead_code)]
pub fn search_rh<T: Into<u64> + std::clone::Clone>(base: &[T], key: &[T]) -> Vec<usize> {
    use std::num::Wrapping;
    const B: Wrapping<u64> = Wrapping(1_000_000_007u64);
    let key_len = key.len();
    let base_len = base.len();
    if key_len > base_len {
        return vec![];
    }
    let mut t = Wrapping(1u64);
    for _ in 0..key_len {
        t *= B;
    }
    let mut key_h = Wrapping(0u64);
    let mut base_h = Wrapping(0u64);
    for i in 0..key_len {
        key_h = key_h * B + Wrapping(key[i].clone().into());
        base_h = base_h * B + Wrapping(base[i].clone().into());
    }
    let mut ret = vec![];
    {
        let mut i = 0;
        while i + key_len <= base_len {
            if key_h == base_h {
                ret.push(i);
            }
            if i + key_len < base_len {
                base_h = base_h * B + Wrapping(base[i + key_len].clone().into())
                    - Wrapping(base[i].clone().into()) * t;
            }
            i += 1;
        }
    }
    ret
}
            
            
            
        