AtCoder Beginner Contest 287 D - Match or Not
この問題では「SとTが前から何番目まで一致しているか」と「SとTが後ろから何番目まで一致しているか」 を先に調べることによってO(N)で問題を解くことができます。
例えば aaabbbccc と a?a?b?c の場合
前から調べると
T | T | T | T | T | T | T | ||
---|---|---|---|---|---|---|---|---|
a | a | a | b | b | b | c | c | c |
a | ? | a | ? | b | ? | c |
後ろから調べると
F | T | T | ||||||
---|---|---|---|---|---|---|---|---|
a | a | a | b | b | b | c | c | c |
a | ? | a | ? | b | ? | c |
後ろから3文字目がマッチしないため それ以降はFとします。
F | F | F | F | F | T | T | ||
---|---|---|---|---|---|---|---|---|
a | a | a | b | b | b | c | c | c |
a | ? | a | ? | b | ? | c |
前からのboolを保存する配列 front_matchと
後ろからのboolを保存する配列 rear_matchを作ります
長さはT+1としてindex0はTとしておきます。
こうすることによってx=0のときは
front_match[0], rear_match[T.length()]
x = 1のときは
front_match[1], rear_match[T.length()-1]
のandをとることによって
TならばYes
FならばNo
と判断することができます。
#include <bits/stdc++.h> using namespace std; bool is_match(char a, char b) { return (a == b || a == '?' || b == '?'); } int main() { string S, T; cin >> S >> T; vector<bool> front_match(T.length()+1, false), rear_match(T.length()+1, false); front_match[0] = true; for (int i = 0; i <= T.length(); i++) { if (!is_match(S[i], T[i])) break; front_match[i+1] = true; } reverse(S.begin(),S.end()); reverse(T.begin(),T.end()); rear_match[0] = true; for (int i = 0; i <= T.length(); i++) { if (!is_match(S[i], T[i])) break; rear_match[i+1] = true; } for (int i = 0; i <= T.length(); i++) { if (front_match[i] && rear_match[T.length()-i]) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }