- #include
- using namespace std;
- using VI = vector<int>;
- using ll = long long;
- using PII = pair
; - const ll mod = 998244353;
- const int N = 1e5 + 10;
- int n,k;
- string t;
- string s;
-
- void check(int x){
- bool found = false;
- for(int i = 0 ; i < k ; i++){
- if(s[x + i] != '#'){
- if(s[x + i] == t[i]){
- found = true;
- }else{
- return;
- }
- }
- }
-
- if(found){
- for(int i = 0 ; i < k ; i++){
- s[x + i] = '#';
- }
- // xxxx # xxxx
- for(int j = x - k + 1 ; j < x && j + k - 1 < n ; j++){
- if(j < 0) continue;
- check(j);
- }
-
- }
-
- }
-
-
- signed main(){
- cin>>n>>k;
- cin>>s>>t;
- for(int i = 0 ; i + k - 1 < n ; i++){
- check(i);
- }
- bool ok = true;
- for(auto x : s){
- if(x != '#') ok = false;
- }
- cout<<(ok ? "Yes" : "No");
-
-
- }
考虑能否将串s还原为 ###########
因为后操作可以覆盖原先的操作,不停找新的能覆盖的区间(区间里至少有一个字母变成 #),进行覆盖,新覆盖的区间可能对前面的k个位置有影响,在搜索前k个位置的覆盖情况