安装在

· · 题解

这题就是大水题。

首先,因为 n\le50,所以可以乱搞。

首先,编写一个 check 函数,用来判断当前位置合不合法。全部枚举一遍,把合法的加入一个 vector 中。注意,原本的「?」 要改成「a」,这样才能保证字典序最小。

啊这,管理说我说明太少,那我就添几句。

聊一下 check 函数的实现方法。

首先,传入一个数 x,用于匹配 a_{x\sim x+|b|1}b_{0\sim |b|-1}。 如果当前字符是「?」(这是个通配符)就直接跳过,反正肯定可以匹配;否则如果出现不一样,直接返回。最后顺利结束,就是合法的啦。

if(check(i)){
            string t = a;
            for(int j = 0;j < b.size();j ++)t[i+j] = b[j];
            for(int j = 0;j < t.size();j ++)t[j] = (t[j]=='?'?'a':t[j]);
            answer.push_back(t);
        }

这段属于水货中的精髓。简单说,首先做一个备份 t,以免把原来的 a 冲掉。然后如果 t_i 是「?」,就把它改成「a」。最后 push_backvector 里,排序(string 本来就重载了字典序的小于号)。

#include<bits/stdc++.h>
using namespace std;
string a,b;
vector<string> answer;
int check(int x){
    for(int i = 0;i < b.size();i ++){
        if(a[x+i] == '?')continue;
        if(a[x+i] != b[i])return 0;
    }
    return 1;
}
int main(){
    cin >> a >> b;
    for(int i = 0;i+b.size()-1 < a.size();i ++){
        if(check(i)){
            string t = a;
            for(int j = 0;j < b.size();j ++)t[i+j] = b[j];
            for(int j = 0;j < t.size();j ++)t[j] = (t[j]=='?'?'a':t[j]);
            answer.push_back(t);
        }
    }
    sort(answer.begin(),answer.end());
    if(answer.size()==0)cout << "UNRESTORABLE" << endl;
    else cout << answer[0] << endl;
    return 0;
}