結果
問題 | No.2283 Prohibit Three Consecutive |
ユーザー |
|
提出日時 | 2023-04-28 21:54:18 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 36 ms / 2,000 ms |
コード長 | 2,567 bytes |
コンパイル時間 | 12,765 ms |
コンパイル使用メモリ | 378,688 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-17 20:51:55 |
合計ジャッジ時間 | 13,749 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 13 |
ソースコード
fn solve(scanner: &mut Scanner) {let n: usize = scanner.next();let s: Vec<usize> = scanner.next::<String>().chars().map(|c| {if c == '0' {0} else if c == '1' {1} else {2}}).collect();let mut ok = false;for t0 in 0..=1 {for t1 in 0..=1 {if s[0] <= 1 && s[0] != t0 {continue;}if s[1] <= 1 && s[1] != t1 {continue;}let mut dp = [[false; 2]; 2];dp[t0][t1] = true;for i in 2..n {let mut p = [[false; 2]; 2];std::mem::swap(&mut dp, &mut p);if s[i] == 0 || s[i] == 2 {dp[0][0] |= p[1][0];dp[1][0] |= p[0][1];dp[1][0] |= p[1][1];}if s[i] == 1 || s[i] == 2 {dp[0][1] |= p[0][0];dp[0][1] |= p[1][0];dp[1][1] |= p[0][1];}}if t0 == 0 && t1 == 0 {ok |= dp[0][1];ok |= dp[1][1];}if t0 == 0 && t1 == 1 {ok |= dp[0][1];ok |= dp[1][0];ok |= dp[1][1];}if t0 == 1 && t1 == 0 {ok |= dp[0][0];ok |= dp[0][1];ok |= dp[1][0];}if t0 == 1 && t1 == 1 {ok |= dp[0][0];ok |= dp[1][0];}}}if ok {println!("Yes");} else {println!("No");}}fn main() {let mut scanner = Scanner::new();let t: usize = scanner.next();for _ in 0..t {solve(&mut scanner);}}pub struct Scanner {buf: Vec<String>,}impl Scanner {fn new() -> Self {Self { buf: vec![] }}fn next<T: std::str::FromStr>(&mut self) -> T {loop {if let Some(x) = self.buf.pop() {return x.parse().ok().expect("");}let mut source = String::new();std::io::stdin().read_line(&mut source).expect("");self.buf = Self::split(source);}}fn split(source: String) -> Vec<String> {source.split_whitespace().rev().map(String::from).collect::<Vec<_>>()}}