The 2019 China Collegiate Programming Contest Harbin Site F. Fixing Banners

Problem - F - Codeforces

翻译:

哈尔滨,这个名字最初是一个满语单词,意思是“晒渔网的地方”,从松花江边的一个小农村居民点发展成为中国东北最大的城市之一。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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值