//所有算法都與數據結構的實現細節分開，並由迭代器參數化
#include <algorithm>
#define 填(下, 上, 值) fill(下, 上, 值)
//#define 找(下, 上, 值) find(下, 上, 値)
#define 各(配列) for_each(全(配列), [](整 值) { 出(值) << " "; })
#define 以上(下, 上, 基準) lower_bound(下, 上, 基準)
#define 最大(下, 上) max_element(下, 上)
//#define 拼(一下, 一上, 二下, 二上) merge(一下, 一上, 二下, 二上, back_inserter(果))
#define 最小(下, 上) min_element(下, 上)
#define 逆(下, 上) reverse(下, 上)
#define 理(下, 上) sort(下, 上)
#define 逆理(下, 上) sort(下, 上, greater<整>())
#define 獨(下, 上) unique(下, 上)
#define 比大(下, 上, 基準) upper_bound(下, 上, 基準)

//數學,標題提供常見的數學函數和各種宏
#include <cmath>
#define 距離(數) abs(數)
#define 切下(數) floor(數)
#define 切上(數) ceil(數)
#define 根(數) sqrt(數)
#define 單縱(角度) sin(角度)
#define 單橫(角度) cos(角度)

//標準輸入輸出
#include <iostream>
#define 入(值) cin >> 值
#define 出(值) cout << 值

//迭代器
#include <iterator>
#define 始(迭代器) (迭代器).begin()
#define 終(迭代器) (迭代器).end()

//地圖,獨特的元件的一種關聯容器的存儲該密鑰與其相對應的值造
#include <map>
#define 計(值) count(值);

//隊列,關於先進先出隊的列類和具有優先級隊列的類
#include <queue>
#define 行(隊列) 隊列.pop()
#define 推(隊列, 值) 隊列.push(值)
#define 面(隊列) 隊列.front()

//堆,關於後進先出容器適配器
#include <stack>
#define 上(容器) 容器.top()

//集,表示一組關聯容器,二叉樹
#include <set>
//#define 找(集, 值) 集.find(值)

//字符串相關的類，函數和字符特徵
#include <string>
#define 長(字符) 字符.length()
#define 部分(字符, 始, 長) 字符.substr(始, 長)

//効用,標題定義了庫中其餘部分使用的許多基本函數和類模板
#include <utility>
#define 組(一, 二) make_pair(一, 二)
#define 換(一, 二) swap(一, 二)

//向量,一個可變長度數組
#include <vector>
#define 去(向量) (向量).clear()
#define 空(向量) 向量.empty()
#define 除(向量, 值) 向量.erase(值)
#define 插(向量, 值) 向量.insert(值)
#define 添(向量, 值) 向量.push_back(值)
#define 變長(向量, 長) 向量.resize(長)
#define 尺寸(向量) 向量.size()

//論理
#define 如(條件) if (條件)
#define 他如(條件) else if (條件)
#define 他 else

//循環
#define 再(變數, 下, 上) for (整 變數 代 下; 變數 <= 上; 變數 代 變數 + 1)
#define 逆再(變數, 上, 下) for (整 變數 代 上; 變數 >= 下; 變數 代 變數 - 1)
#define 在(條件) while (條件)
#define 斷 break
#define 次 continue

//基本
#define 心() main()
#define 返 return

//演算子
#define 代 =
#define 是 ==
#define 又 ||

#define 構 struct
#define 定 const
#define 真 true
#define 偽 false
#define 空行 endl

//標準下
using namespace std;

//中文型繁
typedef int 整數;
typedef void 無;
typedef long long 整;
typedef vector<整> 整向;
typedef vector<整向> 整向向;
typedef vector<整向向> 整向向向;
typedef double 小;
typedef vector<小> 小向;
typedef vector<小向> 小向向;
typedef char 字;
typedef vector<字> 字向;
typedef vector<字向> 字向向;
typedef string 字符;
typedef vector<字符> 字符向;
typedef pair<整, 整> 整對;
typedef vector<整對> 整對向;
typedef pair<小, 小> 小對;
typedef vector<小對> 小對向;
typedef vector<小對向> 小對向向;
typedef pair<整, 小> 整小對;
typedef vector<整小對> 整小對向;
typedef bool 旗;
typedef vector<旗> 旗向;
typedef vector<旗向> 旗向向;
typedef stack<整> 整堆;
typedef queue<整> 整隊;
typedef queue<整對> 整對隊;
typedef priority_queue<整> 優隊;
typedef set<整> 整又;
typedef map<整, 整> 整組;
typedef map<整, 字符> 字組;

構 邊 { 整 對, 費; };
typedef vector<邊> 圖;

整 大值(整 一, 整 二) { 返 max(一, 二); }
整 小值(整 一, 整 二) { 返 min(一, 二); }

//定 整 無限 = (2e9) + 10;
//定 整 法 = 1000000007;
//定 小 境界 = 1e-9;
//定 小 半円 = acos(-1.0);
//定 整 百 = 100;
//定 整 千 = 1000;
//定 整 萬 = 10000;
//定 整 億 = 100000000;
//定 整 四方横[5] = {0,1,0,-1,0};
//定 整 四方縦[5] = {0,0,1,0,-1};
字符 S, s;

無 入力關數()
{
    入(S) >> s;
}

整數 心()
{
    入力關數();
    旗 可 代 0;
    整 開始;
    逆再(位置, 長(S) - 長(s), 0)
    {
        //出(位置) << 空行;
        字符 部 代 部分(S, 位置, 長(s));
        //出(部) << 空行;
        再(數, 0, 長(s) - 1)
        {
            //出(數) << " /" << 長(s) - 1 << 空行;
            //出(部[數]) << " " << s[數] << 空行;
            如(部[數] != s[數] && 部[數] != '?')
            斷;
            如(數 是 長(s) - 1)
            可 代 真;
            //出(可) << 空行;
        }
        如(可)
        {
            開始 代 位置;
            斷;
        }
    }

    如(可)
    {
        再(數, 0, 長(S) - 1)
        {
            如(數 >= 開始 && 數 <= 開始 + 長(s) - 1)
            出(s[數 - 開始]);
            他如(S[數] 是 '?')
            出('a');
            他(出(S[數]));
        }
    }
    他 出("UNRESTORABLE");
    出(空行);
    返 0;
}


Measured memory_bytes: 256