atcoder-solutionsatcoder-solutions
abc329_e

Stamp の解説

解説 by @ohnuma

解説

逆から順に考える。

12 2 XYXXYXXYYYXY XY

の例で考える。

完成形から考えると、最後に追加したところはかならずTが現れるので、それを剥がす。

XYをはがせる。剥がしたところは.にする。

..X..X..YY..

.になったところにはあとからXYが重ね塗りされるので何でも来て良い。 よって、制約がゆるくなった状態で、さっきと同じ問題を解く。

X. の箇所をXYと塗ればよいことがわかるので、これも剥がす。 また、.YもXYと塗れば良い。

.........Y.. -> ............

全部.にできたのでyes。逆にこれができないならno.

Mが最大5文字で優しいので何をやっても通る。

fn main() { input! { n: usize, m: usize, s: Chars, t: Chars } let mut que = VecDeque::new(); let mut vis = vec![false; n]; let mut ans = vec![false; n]; 'la: for i in 0..n { if i + m - 1 >= n { break; } for j in 0..m { if s[i + j] != t[j] { continue 'la; } } for j in 0..m { ans[i + j] = true; } vis[i] = true; que.push_back(i); } while !que.is_empty() { let v = que.pop_front().unwrap(); for j in 0..m { for nan in 0..m { if v + j < nan { continue; } let start = v + j - nan; if start + m - 1 >= n { continue; } let mut flg = true; for (count, idx) in (start..=start + m - 1).enumerate() { if ans[idx] { continue; } if s[idx] != t[count] { flg = false; break; } } if !flg { continue; } for (count, idx) in (start..=start + m - 1).enumerate() { if ans[idx] { continue; } ans[idx] = true; } if vis[start] { continue; } vis[start] = true; que.push_back(start); } } } let ans = ans.iter().all(|&e|e); let ans = if ans {"Yes"} else {"No"}; println!("{}", ans); }

コメント