Problem p03565 (C++)

Buggy submission (status: Runtime Error):
#include <cmath>
#include <iostream>
#include <string>
// #include<array>
#include <algorithm>
#include <deque>
#include <vector>
// #include<utility>
// #include<set>
#include <map>
// #include<list>

using namespace std;
using LLI = long long int;

// vector<int>dir_x = { 0,0,1,1,1,-1,-1,-1 };
// vector<int>dir_y = { 1,-1,1,0,-1,1,0,-1 };
// vector<int>dir_x2 = { 0,0,1,-1 };
// vector<int>dir_y2 = { 1,-1,0,0 };
// vector<char>alp = {
// 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'
// };

// class UnionFind {
// public:
//	vector<int>data;
//	UnionFind(int size) :data(size, -1) {};
//	bool unionset(int x, int y) {
//		x = root(x), y = root(y);
//		if (x != y) {
//			if (data[y] < data[x]) {
//				swap(x, y);
//			}
//			data[x] += data[y];
//			data[y] = x;
//		}
//		return x != y;
//	}
//	bool findset(int x, int y) {
//		return root(x) == root(y);
//	}
//	int root(int x) {
//		return data[x] < 0 ? x : data[x] = root(data[x]);
//	}
//	int size(int x) {
//		return -data[root(x)];
//	}
// };

// LLI gcd(LLI x, LLI y) {
//	LLI tmp, r;
//	if (x < y) {
//		tmp = x;
//		x = y;
//		y = tmp;
//	}
//	r = x % y;
//	while (r != 0) {
//		x = y;
//		y = r;
//		r = x % y;
//	}
//	return y;
// }
// LLI lcm(LLI x,LLI y) {
//	return x / gcd(x,y) * y;
// }

// long nCr(int n,int r) {
//	long ans = 1;
//	for (int i = n; i > n - r;i--) {
//		ans = ans * i;
//	}
//	for (int i = 1; i < r + 1;i++) {
//		ans = ans / i;
//	}
//	return ans;
// }

// const int n_max = 8;
// array<array<bool, n_max>, n_max>graph;
// int dfs(int v,int N,array<bool,n_max>visited) {
//	int ret = 0;
//	bool all_visited = true;
//	for (int i = 0; i < N;i++) {
//		if (visited[i] == false) {
//			all_visited = false;
//		}
//	}
//	if (all_visited) {
//		return 1;
//	}
//	for (int i = 0; i < N;i++) {
//		if (graph[v][i] == false) {
//			continue;
//		}
//		if (visited[i] == true) {
//			continue;
//		}
//		visited[i] = true;
//		ret += dfs(i,N,visited);
//		visited[i] = false;
//	}
//	return ret;
// }

// vector<vector<int>>sub;
// int dfs(int id) {
//	if (sub[id].size() == 0) {
//		return 1;
//	}
//	int minP = (int)1e9;
//	int maxP = 0;
//	for (int i : sub[id]) {
//		int P = dfs(i);
//		minP = min(minP, P);
//		maxP = max(maxP, P);
//	}
//	return minP + maxP + 1;
// }

int main(void) {
  string S, T;
  int place = 0;
  bool res = false;
  cin >> S >> T;
  for (int i = 0; i <= S.size() - T.size(); i++) {
    for (int j = 0; j < T.size(); j++) {
      if (S[i + j] == T[j] || S[i + j] == '?') {
        /*


        もうだめだ
        RE
        はぁ



        */
      } else {
        break;
      }
      if (j == T.size() - 1) {
        place = i;
        res = true;
      }
    }
  }
  if (res) {
    for (int i = 0; i < T.size(); i++) {
      S[i + place] = T[i];
    }
    for (int i = 0; i < S.size(); i++) {
      if (S[i] == '?') {
        S[i] = 'a';
      }
    }
    cout << S << endl;
  } else {
    cout << "UNRESTORABLE" << endl;
  }
  return 0;
}

Fixed submission:
#include <cmath>
#include <iostream>
#include <string>
// #include<array>
#include <algorithm>
#include <deque>
#include <vector>
// #include<utility>
// #include<set>
#include <map>
// #include<list>

using namespace std;
using LLI = long long int;

// vector<int>dir_x = { 0,0,1,1,1,-1,-1,-1 };
// vector<int>dir_y = { 1,-1,1,0,-1,1,0,-1 };
// vector<int>dir_x2 = { 0,0,1,-1 };
// vector<int>dir_y2 = { 1,-1,0,0 };
// vector<char>alp = {
// 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'
// };

// class UnionFind {
// public:
//	vector<int>data;
//	UnionFind(int size) :data(size, -1) {};
//	bool unionset(int x, int y) {
//		x = root(x), y = root(y);
//		if (x != y) {
//			if (data[y] < data[x]) {
//				swap(x, y);
//			}
//			data[x] += data[y];
//			data[y] = x;
//		}
//		return x != y;
//	}
//	bool findset(int x, int y) {
//		return root(x) == root(y);
//	}
//	int root(int x) {
//		return data[x] < 0 ? x : data[x] = root(data[x]);
//	}
//	int size(int x) {
//		return -data[root(x)];
//	}
// };

// LLI gcd(LLI x, LLI y) {
//	LLI tmp, r;
//	if (x < y) {
//		tmp = x;
//		x = y;
//		y = tmp;
//	}
//	r = x % y;
//	while (r != 0) {
//		x = y;
//		y = r;
//		r = x % y;
//	}
//	return y;
// }
// LLI lcm(LLI x,LLI y) {
//	return x / gcd(x,y) * y;
// }

// long nCr(int n,int r) {
//	long ans = 1;
//	for (int i = n; i > n - r;i--) {
//		ans = ans * i;
//	}
//	for (int i = 1; i < r + 1;i++) {
//		ans = ans / i;
//	}
//	return ans;
// }

// const int n_max = 8;
// array<array<bool, n_max>, n_max>graph;
// int dfs(int v,int N,array<bool,n_max>visited) {
//	int ret = 0;
//	bool all_visited = true;
//	for (int i = 0; i < N;i++) {
//		if (visited[i] == false) {
//			all_visited = false;
//		}
//	}
//	if (all_visited) {
//		return 1;
//	}
//	for (int i = 0; i < N;i++) {
//		if (graph[v][i] == false) {
//			continue;
//		}
//		if (visited[i] == true) {
//			continue;
//		}
//		visited[i] = true;
//		ret += dfs(i,N,visited);
//		visited[i] = false;
//	}
//	return ret;
// }

// vector<vector<int>>sub;
// int dfs(int id) {
//	if (sub[id].size() == 0) {
//		return 1;
//	}
//	int minP = (int)1e9;
//	int maxP = 0;
//	for (int i : sub[id]) {
//		int P = dfs(i);
//		minP = min(minP, P);
//		maxP = max(maxP, P);
//	}
//	return minP + maxP + 1;
// }

int main(void) {
  string S, T;
  int place = 0;
  bool res = false;
  cin >> S >> T;
  for (int i = 0; i < S.size() - T.size() + 1; i++) {
    for (int j = 0; j < T.size(); j++) {
      if (S[i + j] == T[j] || S[i + j] == '?') {
        /*


        もうだめだ
        RE
        はぁ



        */
      } else {
        break;
      }
      if (j == T.size() - 1) {
        place = i;
        res = true;
      }
    }
  }
  if (res) {
    for (int i = 0; i < T.size(); i++) {
      S[i + place] = T[i];
    }
    for (int i = 0; i < S.size(); i++) {
      if (S[i] == '?') {
        S[i] = 'a';
      }
    }
    cout << S << endl;
  } else {
    cout << "UNRESTORABLE" << endl;
  }
  return 0;
}