爆搜找字符串
https://atcoder.jp/contests/abc268/tasks/abc268_d
#include<bits/stdc++.h>
using namespace std;
const double PI=acos(-1);
#define int long long
#define double long double
#define endl '\n'
const int N=1e5+10;
int n, m, a[N], b[N];
string s[N], ss[N];
map<string, int> mp;
bool vis[N];
void dfs(int u, int sz, string name)
{
if(u == n)
{
if(name.size() < 3 || name.size() > 16) return ;
else if(!mp[name])
{
cout << name << endl;
exit(0);
}
}
else
{
for(int i = 0; i < n ; i ++ )
{
if(!vis[i])
{
vis[i] = true;
string temp = name;
temp += s[i];
if(u == n - 1) dfs(u + 1, sz, temp);
else
{
for(int j = 1 ; j <= sz ; j ++ )
{
if(j + (n - u -2) <= sz) //u当前匹配到的数组的上一个 所以保证可以匹配到的是n-u-2个空格
{
temp += '_';
dfs(u + 1, sz - j, temp);
}
}
}
vis[i] = false;
}
}
}
}
void solve()
{
cin >> n >> m;
int sum = 0;
for(int i = 0 ; i < n ; i ++ ) cin >> s[i], sum += s[i].size();
for(int i = 0 ; i < m ; i ++ ) cin >> ss[i], mp[ss[i]] ++ ;
dfs(0, 16 - sum, "");
puts("-1");
}
signed main(){
solve();
}