結果
| 問題 |
No.2231 Surprising Flash!
|
| コンテスト | |
| ユーザー |
umnc
|
| 提出日時 | 2023-02-26 17:02:38 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,625 bytes |
| コンパイル時間 | 614 ms |
| コンパイル使用メモリ | 69,416 KB |
| 実行使用メモリ | 14,016 KB |
| 最終ジャッジ日時 | 2024-09-14 07:09:39 |
| 合計ジャッジ時間 | 7,037 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 1 |
| other | WA * 14 TLE * 1 -- * 29 |
ソースコード
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string solve(int n, int m, string s1, string s2) {
int k = s2.size();
// s2を構成する文字がs1に含まれるかを調べる
bool exist[26] = {};
for (char c : s2) {
if (c != '?') {
exist[c - 'a'] = true;
}
}
for (char c : s1) {
if (c != '?' && !exist[c - 'a']) {
return "-1"; // s1に含まれない文字がs2に含まれる場合
}
}
// s2を含む部分列を構成する
string ans(n, ' ');
for (int i = 0; i <= n - k; i++) {
bool ok = true;
for (int j = 0; j < k; j++) {
if (s2[j] != '?' && s1[i+j] != s2[j]) {
ok = false;
break;
}
}
if (ok) {
string tmp = s1;
for (int j = 0; j < k; j++) {
if (s2[j] != '?') {
tmp[i+j] = s2[j];
}
}
for (int j = 0; j < n; j++) {
if (tmp[j] == '?') {
tmp[j] = 'a'; // ? を a に置き換える
}
}
if (ans == " " || tmp < ans) {
ans = tmp;
}
}
}
if (ans == " ") {
return "-1"; // s2を含む部分列が存在しない場合
} else {
return ans;
}
}
int main() {
int t;
cin >> t;
for (int i = 0; i < t; i++) {
int n, m;
string s1, s2;
cin >> n >> m >> s1 >> s2;
cout << solve(n, m, s1, s2) << endl;
}
return 0;
}
umnc