ABC268D解题报告
题意
分析
题目一眼看出是 dfs 暴搜的题,只需要先全排列一下每一个字符串的顺序,再根据字符串已有的长度去再 dfs 一遍中间插入 _
的数量。
对于不能重复,易得通过一个 map 去存储已经出现的 string,最后在 dfs 找到答案的时候看一下 map 中有没有出现即可。
注意:长度要满足 \(3 \le X \le 16\)。
代码
#include<bits/stdc++.h>
using namespace std;
int n, m;
int a[10], vis[10];
string s[10], t[100005];
vector<string> v;
map<string, int> mp;
void dfs1(int x, int sum){
if (sum < 0) return ;
if (x == n){
if(16 - sum < 3) return;
string ans = v[0];
for (int i = 1; i < n; i++){
for (int j = 1; j <= a[i]; j++) ans += "_";
ans += v[i];
}
if (mp[ans] == 0) cout << ans, exit(0);
return ;
}
for (int i = 1; i <= sum; i++){
a[x] = i;
dfs1(x + 1, sum - i);
}
}
void dfs(int x, int sum){
if (x == n + 1){
memset(a, 0, sizeof(a));
dfs1(1, 16 - sum);
return ;
}
for (int i = 1; i <= n; i++){
if (vis[i] == 0){
v.push_back(s[i]), vis[i] = 1;
dfs(x + 1, sum + s[i].size());
vis[i] = 0, v.pop_back();
}
}
}
int main(){
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> s[i];
for (int i = 1; i <= m; i++){
cin >> t[i];
mp[t[i]] = 1;
}
dfs(1, 0);
cout << -1;
return 0;
}