返回题解分享
讨论 / 题解分享/ 帖子详情

用户名 - 题解

dfs



#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 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!