window.cnblogsConfig = {//可以放多张照片,应该是在每一个博文上面的图片,如果是多张的话,那么就随机换的。 homeTopImg: [ "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png", "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png" ], }

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;
}
posted @ 2024-01-18 07:48  CCF_IOI  阅读(23)  评论(0)    收藏  举报