$ -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;
标签:tmp,begin,ABC,end,int,用户名,无耻,268,Takahashi
From: https://www.cnblogs.com/AProblemSolver/p/16705749.html