题解分享
题解分享简介
用户名 - 题解
dfs
```cpp
#include <iostream>
#include <string>
#include <vector>
#include <numeric>
#include <unordered_set>
using namespace std;
using ll = long long;
struct AC {
int n, m;
vector<string> sArr;
unordered_set<string> noArr;
vector<char> vis;
string res{}, now{};
void run() {
cin >> n >> m;
sArr.resize(n);
vis = vector<char>(n);
int len = 0;
for (int i = 0; i < n; ++i) {
cin >> sArr[i];
len += sArr[i].size();
}
for (int i = 0; i < m; ++i) {
string s;
cin >> s;
noArr.insert(std::move(s));
}
if (len + n - 1 > 16) {
cout << -1 << '\n';
return;
}
dfs(n - 1);
if (res.size()) {
cout << res << '\n';
} else {
cout << -1 << '\n';
}
}
// 枚举选哪个
void dfs(int k) {
if (k < 0) {
if (!noArr.count(now) && now.size() >= 3) {
res = now;
}
return;
}
for (int i = 0; i < n; ++i) {
if (vis[i])
continue;
vis[i] = 1;
if (now.size()) {
const int end = 16 - now.size() - sArr[i].size();
for (int j = 1; j <= end; ++j) {
string tmp = now;
// 选
now = now + string(j, '_') + sArr[i];
dfs(k - 1);
if (res.size())
return;
now = std::move(tmp);
}
} else {
string tmp = now;
now += sArr[i];
dfs(k - 1);
if (res.size())
return;
now = std::move(tmp);
}
vis[i] = 0;
}
}
};
int main() {
AC ac;
ac.run();
return 0;
}
```
查看全文
0
0
1
5



