跳转至

ABC301C AtCoder Cards 题解

洛谷题面 | AtCoder 题面 | AC 记录 | \(\texttt{\color{968d81}*380}\)

首先,我们搞出来 \(S\)\(T\) 中各种字符的数量(和 @ 的数量)。注意也要同时搞出来字符集。

string s,t;
int sa,ta;
map<char,int>ss,tt;
set<char>al;

for(char i:s){
    if(i=='@')++sa;
    else{
        ++ss[i];
        al.insert(i);
    }
}
for(char i:t){
    if(i=='@')++ta;
    else{
        ++tt[i];
        al.insert(i);
    }
}

再枚举字符集中的字符,若数量不同则考虑花费一定量的 @ 来补成一样的。

for(char i:al){
    int sc=ss[i], tc=tt[i];
    if(sc<tc){
        if(qwq.find(i)==-1){
            cout<<"No"<<endl;
            return;
        }
        else sa-=tc-sc;
    }
    if(sc>tc){
        if(qwq.find(i)==-1){
            cout<<"No"<<endl;
            return;
        }
        else ta-=sc-tc;
    }
}

完整代码如下:

// 珍爱账号,请勿贺题
#include <bits/stdc++.h>
using namespace std;
#define int long long

string s,t;
int sa,ta;
map<char,int>ss,tt;
set<char>al;
string atc="atcoder";
void solve(){
    cin>>s>>t;

    for(char i:s){
        if(i=='@')++sa;
        else{
            ++ss[i];
            al.insert(i);
        }
    }
    for(char i:t){
        if(i=='@')++ta;
        else{
            ++tt[i];
            al.insert(i);
        }
    }

    for(char i:al){
        int sc=ss[i], tc=tt[i];
        if(sc<tc){
            if(atc.find(i)==-1){
                cout<<"No"<<endl;
                return;
            }
            else sa-=tc-sc;
        }
        if(sc>tc){
            if(atc.find(i)==-1){
                cout<<"No"<<endl;
                return;
            }
            else ta-=sc-tc;
        }
    }

    cout<<((sa==ta&&sa>=0)?"Yes":"No")<<endl;
}

int32_t main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    solve();

    return 0;
}

评论