結果
| 問題 |
No.2761 Substitute and Search
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-03-09 03:49:20 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,573 bytes |
| コンパイル時間 | 13,361 ms |
| コンパイル使用メモリ | 387,864 KB |
| 実行使用メモリ | 172,800 KB |
| 最終ジャッジ日時 | 2025-03-09 03:50:04 |
| 合計ジャッジ時間 | 29,324 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 4 WA * 9 |
コンパイルメッセージ
warning: variable does not need to be mutable
--> src/main.rs:68:27
|
68 | fn get_sum(&mut self, mut l: usize, mut r: usize) -> u64 {
| ----^
| |
| help: remove this `mut`
|
= note: `#[warn(unused_mut)]` on by default
warning: variable does not need to be mutable
--> src/main.rs:68:41
|
68 | fn get_sum(&mut self, mut l: usize, mut r: usize) -> u64 {
| ----^
| |
| help: remove this `mut`
warning: variable `L` should have a snake case name
--> src/main.rs:70:17
|
70 | let mut L = self.size + l;
| ^ help: convert the identifier to snake case: `l`
|
= note: `#[warn(non_snake_case)]` on by default
warning: variable `R` should have a snake case name
--> src/main.rs:71:17
|
71 | let mut R = self.size + r;
| ^ help: convert the identifier to snake case: `r`
ソースコード
use std::collections::VecDeque;
use std::io::{self, BufRead};
const B: u64 = 30;
const H: u64 = 9007199254740997;
struct SegmentTree {
size: usize,
pow_b: Vec<u64>,
array: Vec<u64>,
weights: Vec<u64>,
l_queue: VecDeque<usize>,
r_queue: VecDeque<usize>,
}
impl SegmentTree {
fn new(init_array: &[u64], pow_b: &[u64]) -> Self {
let mut n = 1;
while n < init_array.len() {
n *= 2;
}
let size = n;
let mut array = vec![0; 2 * size];
let mut weights = vec![0; 2 * size];
for (i, &a) in init_array.iter().enumerate() {
array[size + i] = a;
weights[size + i] = 1;
}
let mut start_index = size / 2;
let mut end_index = size;
while start_index >= 1 {
for i in start_index..end_index {
weights[i] = weights[2 * i] + weights[2 * i + 1];
array[i] = Self::op(&array, &pow_b, &weights, 2 * i, 2 * i + 1);
}
end_index = start_index;
start_index /= 2;
}
Self {
size,
pow_b: pow_b.to_vec(),
array,
weights,
l_queue: VecDeque::new(),
r_queue: VecDeque::new(),
}
}
fn op(array: &[u64], pow_b: &[u64], weights: &[u64], l: usize, r: usize) -> u64 {
let mut a = (pow_b[weights[r] as usize] * array[l]) % H;
a = (a + array[r]) % H;
a
}
fn set(&mut self, x: usize, a: u64) {
let mut index = self.size + x;
self.array[index] = a;
while index > 1 {
index /= 2;
self.array[index] = Self::op(&self.array, &self.pow_b, &self.weights, 2 * index, 2 * index + 1);
}
}
fn get_sum(&mut self, mut l: usize, mut r: usize) -> u64 {
let mut s = 0;
let mut L = self.size + l;
let mut R = self.size + r;
while L < R {
if R & 1 == 1 {
R -= 1;
self.r_queue.push_front(R);
}
if L & 1 == 1 {
self.l_queue.push_back(L);
L += 1;
}
L /= 2;
R /= 2;
}
while let Some(l) = self.l_queue.pop_front() {
s = (s * self.pow_b[self.weights[l] as usize]) % H;
s = (s + self.array[l]) % H;
}
while let Some(l) = self.r_queue.pop_front() {
s = (s * self.pow_b[self.weights[l] as usize]) % H;
s = (s + self.array[l]) % H;
}
s
}
}
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
let first_line = lines.next().unwrap().unwrap();
let mut iter = first_line.split_whitespace().map(|s| s.parse::<usize>().unwrap());
let (n, l, q) = (iter.next().unwrap(), iter.next().unwrap(), iter.next().unwrap());
let mut s_arrays = Vec::new();
let mut segs = Vec::new();
let mut pow_b = vec![0; l + 1];
let mut b = 1;
for i in 0..=l {
pow_b[i] = b;
b = (b * B) % H;
}
for _ in 0..n {
let s = lines.next().unwrap().unwrap();
let s_array: Vec<u64> = s.chars().map(|c| (c as u64) - ('a' as u64) + 1).collect();
s_arrays.push(s_array.clone());
segs.push(SegmentTree::new(&s_array, &pow_b));
}
for _ in 0..q {
let query = lines.next().unwrap().unwrap();
let values: Vec<&str> = query.split_whitespace().collect();
if values[0] == "1" {
let k = values[1].parse::<usize>().unwrap() - 1;
let c = (values[2].chars().next().unwrap() as u64) - ('a' as u64) + 1;
let d = (values[3].chars().next().unwrap() as u64) - ('a' as u64) + 1;
for i in 0..n {
if s_arrays[i][k] == c {
s_arrays[i][k] = d;
segs[i].set(k, d);
}
}
} else if values[0] == "2" {
let t = values[1];
let mut t_hash = 0;
for t0 in t.chars() {
t_hash = (t_hash * B) % H;
t_hash = (t_hash + (t0 as u64 - 'a' as u64 + 1)) % H;
}
let t_len = t.len();
let mut answer = 0;
for i in 0..n {
let x = segs[i].get_sum(0, t_len);
if t_hash == x {
answer += 1;
}
}
println!("{}", answer);
}
}
}