【Codeforces Round #403】Codeforces 781B Innokenty and a Football League

Innokenty is a president of a new football league in Byteland. The
first task he should do is to assign short names to all clubs to be
shown on TV next to the score. Of course, the short names should be
distinct, and Innokenty wants that all short names consist of three
letters.

Each club’s full name consist of two words: the team’s name and the
hometown’s name, for example, “DINAMO BYTECITY”. Innokenty doesn’t
want to assign strange short names, so he wants to choose such short
names for each club that:

the short name is the same as three first letters of the team's name, for example, for the mentioned club it is "DIN",
or, the first two letters of the short name should be the same as the first two letters of the team's name, while the third letter is

the same as the first letter in the hometown’s name. For the mentioned
club it is “DIB”.

Apart from this, there is a rule that if for some club x the second
option of short name is chosen, then there should be no club, for
which the first option is chosen which is the same as the first option
for the club x. For example, if the above mentioned club has short
name “DIB”, then no club for which the first option is chosen can have
short name equal to “DIN”. However, it is possible that some club have
short name “DIN”, where “DI” are the first two letters of the team’s
name, and “N” is the first letter of hometown’s name. Of course, no
two teams can have the same short name.

Help Innokenty to choose a short name for each of the teams. If this
is impossible, report that. If there are multiple answer, any of them
will suit Innokenty. If for some team the two options of short name
are equal, then Innokenty will formally think that only one of these
options is chosen. Input

The first line contains a single integer n (1 ≤ n ≤ 1000) — the number
of clubs in the league.

Each of the next n lines contains two words — the team’s name and the
hometown’s name for some club. Both team’s name and hometown’s name
consist of uppercase English letters and have length at least 3 and at
most 20. Output

It it is not possible to choose short names and satisfy all
constraints, print a single line “NO”.

Otherwise, in the first line print “YES”. Then print n lines, in each
line print the chosen short name for the corresponding club. Print the
clubs in the same order as they appeared in input.

If there are multiple answers, print any of them.

可以首先全选第一选择,如果出现矛盾,这些人必须全换成第二选择。如果新的第二选择和另一个人的第一选择冲突的话那个人必须也换成第二选择,如果那个人也是第二选择那就无解了。
我具体实现的时候是逐个加入球队,冲突的处理方法和上面一样。

#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;
map<string,int> mp;
string fir[1010],sec[1010],s1,s2;
int now[1010],n,ok=1;
void ins(int x)
{
    int y;
    if (!mp.count(sec[x])) mp[sec[x]]=x;
    else
    {
        y=mp[sec[x]];
        mp[sec[x]]=x;
        if (y==-1) return;
        if (now[y]==2) ok=0;
        else
        {
            now[y]=2;
            ins(y);
        }
    }
}
int main()
{
    int y;
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        cin>>s1>>s2;
        fir[i]=s1.substr(0,3);
        sec[i]=s1.substr(0,2)+s2[0];
    }
    for (int i=1;i<=n&&ok;i++)
        if (!mp.count(fir[i])) mp[fir[i]]=i,now[i]=1;
        else
        {
            now[i]=2;
            ins(i);
            y=mp[fir[i]];
            if (y==-1) continue;
            if (now[y]==1)
            {
                mp[fir[i]]=-1;
                now[y]=2;
                ins(y);
            }
        }
    if (ok)
    {
        cout<<"YES"<<endl;
        for (int i=1;i<=n;i++)
            if (now[i]==1) cout<<fir[i]<<endl;
            else cout<<sec[i]<<endl;
    }
    else cout<<"NO"<<endl;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值