結果
問題 |
No.3290 Encrypt Failed, but Decrypt Succeeded
|
ユーザー |
|
提出日時 | 2025-09-18 10:38:01 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 6 ms / 2,000 ms |
コード長 | 1,446 bytes |
コンパイル時間 | 11,691 ms |
コンパイル使用メモリ | 400,512 KB |
実行使用メモリ | 7,720 KB |
最終ジャッジ日時 | 2025-09-18 10:38:37 |
合計ジャッジ時間 | 13,554 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
fn getline() -> String { let mut ret = String::new(); std::io::stdin().read_line(&mut ret).unwrap(); ret } fn main() { let ints = getline() .split_whitespace() .map(|x| x.parse::<i64>().unwrap()) .collect::<Vec<_>>(); let k = ints[1]; let t = getline().trim().bytes().map(|i| i - b'0').collect::<Vec<_>>(); let n = t.len(); let mut dp = vec![0i64; n + 1]; dp[n] = 1; for i in (0..n).rev() { let mut me = 0i64; if t[i] != 0 { me = me.saturating_add(dp[i + 1]); } if i + 2 <= n { let val = t[i] * 10 + t[i + 1]; if 10 <= val && val <= 26 { me = me.saturating_add(dp[i + 2]); } } dp[i] = me.min(k + 1); } let mut ans = "".to_string(); let mut rem = k - 1; let mut i = 0; while i < n { let one = if t[i] == b'0' { 0 } else { dp[i + 1] }; if rem < one { ans.push((b'a' + t[i] - 1) as char); } else { rem -= one; let val = if i + 2 <= n { t[i] * 10 + t[i + 1] } else { panic!() }; if 10 <= val && val <= 26 { ans.push((b'a' + val - 1) as char); i += 1; } else { panic!(); } } i += 1; } assert_eq!(rem, 0); println!("{ans}"); }