ABC 268 D(无耻)

image
$ -1 $ 天……

题面

Takahashi 有 $ N $ 个组成他的全名的单词(比如真实世界中,$ N = 2 $ ,字符串是“Naohiro”和“Takahashi”)。这些单词分别是 $ S_1, S_2, S_3, \cdots, S_N $ 。
现在,Takahashi 将把它们随意排列,用下划线组合起来(两个单词之间任意个下划线,创造一个 BBS World 账号。
BBS World 上(在 Takahashi 没来前)有 $ M $ 个用户。他们的用户名分别是 $ T_1, T_2, T_3, \cdots, T_M $ ,所以 Takahashi 的用户名不能和他们一样。另外,用户名的长度应该在 $ 3 $ 到 $ 16 $ 之间。
帮 Takahashi 决定一个用户名。

思路

$ N \le 8 $……
这范围也是没谁了……
全排列吧……


剩下的部分,我们就可以用 $ DFS $ 简单的解决了。
这部分请参照代码。


$ 10^5 $ 一一检查,时间不够咋办?
答案:二分。

代码

#include <bits/stdc++.h>
using namespace std;

int N, M;
vector<string> S, T;

void dfs(int cur, int remain, string ans = "") {
	if (remain < 0) {
		return;
	}
	if (cur == N) {
		if (ans.size() >= 3 && !binary_search(T.begin(), T.end(), ans)) {
			cout << ans;
			exit(0);
		}
		return;
	}
	if (ans.size() && ans.back() != '_') {
		dfs(cur, remain - 1, ans + '_');
	} else {
		dfs(cur + 1, remain, ans + S[cur]);
		if (ans.size()) {
			dfs(cur, remain - 1, ans + '_');
		}
	}
}

int main() {
	cin >> N >> M;
	string tmp;
	int rem = 16;
	for (int i = 0; i < N; i++) {
		cin >> tmp;
		S.push_back(tmp);
		rem -= tmp.size();
	}
	for (int i = 0; i < M; i++) {
		cin >> tmp;
		T.push_back(tmp);
	}
	sort(S.begin(), S.end());
	sort(T.begin(), T.end());
	do {
		dfs(0, rem);
	} while (next_permutation(S.begin(), S.end()));
	cout << -1;
	return 0;
}

不知道大家的初赛 RP 都是多少呢?

double RP = DBL_MAX;
posted @ 2022-09-18 20:49  A-Problem-Solver  阅读(41)  评论(0编辑  收藏  举报