complete 9437.rs 12082.rs 12083.rs 12149.rs 17245.rs
This commit is contained in:
71
storage/zeta/rs/completed/12149.rs
Normal file
71
storage/zeta/rs/completed/12149.rs
Normal file
@@ -0,0 +1,71 @@
|
||||
use std::io::{read_to_string, stdin};
|
||||
|
||||
// maxima: 2
|
||||
// 1/4 * 2 + 1/4 * 1 + 1/4
|
||||
/*
|
||||
|
||||
GO
|
||||
*/
|
||||
|
||||
fn get_max_overlap(target: &String) -> usize {
|
||||
let l = target.len();
|
||||
let chs: Vec<char> = target.chars().collect();
|
||||
|
||||
for i in 1..l {
|
||||
if chs[i..] == chs[..l - i] {
|
||||
return l - i;
|
||||
}
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
fn expected_my_banana(keyboard: String, target: String, s: usize) -> f64 {
|
||||
let k = keyboard.len();
|
||||
let l = target.len();
|
||||
let key_distribution = keyboard.chars().fold([0usize; 26], |mut acc, x| {
|
||||
acc[x as usize - 'A' as usize] += 1;
|
||||
accQ
|
||||
});
|
||||
|
||||
let key_proba = key_distribution.map(|x| x as f64 / k as f64);
|
||||
let proba_de_target = target
|
||||
.chars()
|
||||
.fold(1.0, |acc, x| acc * key_proba[x as usize - 'A' as usize]);
|
||||
let overlap = get_max_overlap(&target);
|
||||
|
||||
let maxima_banana: f64 = {
|
||||
let mut flag = false;
|
||||
for key in target.chars() {
|
||||
if key_distribution[key as usize - 'A' as usize] == 0 {
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if flag {
|
||||
return 0.0;
|
||||
} else {
|
||||
1.0 + ((s - l) / (l - overlap)) as f64
|
||||
}
|
||||
};
|
||||
|
||||
let expected_give = proba_de_target * (s - l + 1) as f64;
|
||||
maxima_banana - expected_give
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let temp = read_to_string(stdin()).unwrap();
|
||||
let mut iter = temp.split_ascii_whitespace();
|
||||
|
||||
let n = iter.next().unwrap().parse::<usize>().unwrap();
|
||||
(0..n).for_each(|case| {
|
||||
iter.next();
|
||||
iter.next();
|
||||
let s = iter.next().unwrap().parse().unwrap();
|
||||
|
||||
let keyboard = iter.next().unwrap().trim().to_string();
|
||||
let target = iter.next().unwrap().trim().to_string();
|
||||
|
||||
let res = expected_my_banana(keyboard, target, s);
|
||||
println!("Case #{}: {:0.8}", case + 1, res);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user