翻译:
哈尔滨,这个名字最初是一个满语单词,意思是“晒渔网的地方”,从松花江边的一个小农村居民点发展成为中国东北最大的城市之一。1898年,随着中国东部铁路的到来,这座城市首先作为一个由来自俄罗斯帝国的绝大多数移民居住的地区而繁荣起来。现在,哈尔滨是黑龙江省的省会,也是中华人民共和国东北地区最大的城市。它是东北地区重要的政治、经济、科学、文化和通信枢纽,也是国家重要的工业基地。
今年,一场由东北林业大学主办的CCPC地区比赛将在这个美丽的城市举行。为了确保比赛的成功,让全国各地的程序员都能享受比赛,比赛的准备工作在比赛开始前几个月就已经开始了。
你是学生志愿者小组的组长,负责在活动期间制作装饰校园的横幅。不幸的是,你们小组犯了一个错误,印错了其中一个横幅。准确地说,横幅上没有“哈尔滨”二字。因为你没有时间重新打印,唯一的办法就是从一些用过的旧横幅上剪下字母,粘贴到打印错误的横幅上。你有六个横幅,出于某种原因,你必须从每个横幅上剪下一个字母。然后,你可以把这六个字母排列粘贴到打印错误的横幅上,试着把缺失的单词“harbin”拼出来。然而,在你开始切割之前,你决定写一个程序来看看这是否可行。
输入
输入包含多个case。输入的第一行包含单个整数𝑇(1≤𝑇≤50000)
,即病例数。
对于每种情况,输入包含6行。每行包含一个非空字符串,仅由小写英文字母组成,描述旧横幅上的字母。
所有情况下所有字符串的总长度不超过2⋅106
.
输出
对于每种情况,如果有可能生成单词“harbin”,则打印字符串“Yes”(不带引号),否则打印字符串“No”(不带引号)。
例子
inputCopy
2
欢迎
toparticipate
在
ccpccontest
inharbin
10月
收获
属于
忍者
重置
令人惊异的
有趣的
outputCopy
没有
是的
思路:刚开始没仔细看,以为是简单的随意取拼接,以为是暴力。后来又读了下题,发现是给6个字符串,然后每个字符串只能取一个,最后拼成“harbin”。这样的话,暴力情况就有很多了。
我是用dfs写的,直接暴力搜索就可以,因为只有6个字符串。
其他的写法,又可以用 全排列函数 暴力写。还有大佬说这是二分图的什么性质,也可以用二分图来写。
朴实无华的代码:
/*Looking! The blitz loop this planet to search way
Only my RAILGUN can shoot it 今すぐ
身体中を 光の速さで
駆け巡った確かな予感
掴め! 望むものなら残さず
輝ける自分らしさで
信じてるよ あの日の誓いを
この瞳に光る涙それさえも 強さになるから
*/
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <stdio.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<tuple>
#include<numeric>
#include<stack>
using namespace::std;
typedef long long ll;
inline __int128 read(){
__int128 x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
inline void print(__int128 x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9)
print(x / 10);
putchar(x % 10 + '0');
}
//struct dian{
// double x,y;
//}A,B,C,D,E,F;//点
//cin>>A.x>>A.y>>B.x>>B.y>>C.x>>C.y>>D.x>>D.y>>E.x>>E.y>>F.x>>F.y;
//double len(dian x,dian y){
// return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
//}//两点之间距离
//double xj(dian x,dian y,dian z){
// x.x-=y.x;
// x.y-=y.y;
// z.x-=y.x;
// z.y-=y.y;
// return x.x*z.y-x.y*z.x;
//}//叉积
int n,t;
string a="harbin";
map<char,int>ff[7];
int vis[10];
int na=0;
void dfs(int x){
if (x==6) {
na=1;return;
}
for (int i=0; i<6; i++) {
if (vis[i]) {
continue;
}
if(ff[i][a[x]]){
vis[i]=1;
dfs(x+1);
vis[i]=0;
}
}
}
void wanyurukong(){
string s="";
for (int i =0; i<6; i++) {
ff[i].clear();
}
for (int i =0; i<6; i++) {
cin>>s;
for (int j =0; j<s.size(); j++) {
ff[i][s[j]]++;
}
}
na=0;
dfs(0);
if (na) {
cout<<"Yes\n";return;
}
cout<<"No\n";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(); cout.tie();
cin>>t;
while (t--) {
wanyurukong();
}
//wanyurukong
return 0;
}