加载中...

爆搜找字符串

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();
}
posted @ 2022-09-15 10:39  liang302  阅读(17)  评论(0编辑  收藏  举报