結果
| 問題 |
No.430 文字列検索
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-09-27 12:21:54 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 783 ms / 2,000 ms |
| コード長 | 1,791 bytes |
| コンパイル時間 | 28,001 ms |
| コンパイル使用メモリ | 397,788 KB |
| 実行使用メモリ | 7,716 KB |
| 最終ジャッジ日時 | 2025-09-27 12:23:05 |
| 合計ジャッジ時間 | 20,885 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 14 |
コンパイルメッセージ
warning: constant `pow26` should have an upper case name --> src/main.rs:11:7 | 11 | const pow26:[usize;10] = [ | ^^^^^ help: convert the identifier to upper case: `POW26` | = note: `#[warn(non_upper_case_globals)]` on by default
ソースコード
/*
* Author: srtry
* Created: 2025-09-23T00:46:59+09:00
* Coding: utf-8-unix
*/
use proconio::input;
use proconio::marker::Chars;
use std::{io::{stdout, BufWriter, Write}};
const pow26:[usize;10] = [
1,
26,
676,
17576,
456976,
11881376,
308915776,
8031810176,
208827064576,
5429503678976
];
fn my_hash(arg:&Vec<char>) -> usize {
let mut hash_:usize = 0;
for (i,&ch) in arg.iter().enumerate() {
let tmp:usize = ((ch.clone() as u8) - b'A') as usize;
hash_ += tmp * pow26[i];
}
hash_
}
fn main() {
input!{
s:Chars,
m:usize,
c:[Chars;m]
}
let out = stdout();
let mut out = BufWriter::new(out.lock());
let mut roll_hashes:[usize;10] = [0;10];
for i in 1..=10 {
if i<=s.len(){
let tmp:Vec<char> = (s[..i]).iter().cloned().collect::<Vec<char>>();
roll_hashes[i-1] = my_hash(&tmp);
}
}
let mut ans:usize = 0;
for c_elem in c.iter() {
if c_elem.len() > s.len() {
continue;
}
// 検索文字列のハッシュ計算
let c_hash:usize = my_hash(&c_elem);
let mut roll_hash:usize = 26*roll_hashes[c_elem.len()-1];
let mut pre_top_hash:usize = 0;
let mut last_hash:usize = 0;
for i in 0..s.len()-c_elem.len()+1{
roll_hash = (roll_hash - pre_top_hash)/26 + (last_hash*pow26[c_elem.len()-1]);
if roll_hash == c_hash {
ans += 1;
}
pre_top_hash = ((s[i] as u8) - b'A') as usize;
if i+c_elem.len() < s.len(){
last_hash = ((s[i+c_elem.len()] as u8) - b'A') as usize};
}
}
write!(out, "{}", ans).unwrap();
}