C题为啥过不了?

void solve(){
	ll n, x, y;
    string a, b, c;
    cin >> n >> x >> y >> a >> b >> c;
    vector<ll> aunmatch1pos, aunmatch0pos;
    vector<ll> bunmatch1pos, bunmatch0pos;
    
    ll unmatched = 0, matched = 0;
    for(ll i = 0; i < n; i++){
        if( ((a[i]-'0')^(b[i]-'0')) == (c[i]-'0') ){
            matched ++;
        }
        else{
            if(a[i] == '1')
            aunmatch1pos.push_back(i);
            else
            aunmatch0pos.push_back(i);
            if(b[i] == '1')
            bunmatch1pos.push_back(i);
            else
            bunmatch0pos.push_back(i);
            unmatched ++;
        }
    }
    // a和b可能会是 00 01 10 11
    // 但a和b异或只会有两种结果
    // 即 0 或 1
    // 00和11的结果相同, 10和01也相同
    // 如果答案不匹配,修改任意一个(a或b)都可以得到正确答案
    ll ans1 = unmatched * x;// 只反置的方案
    
    // 交换的话,需要i和j位上都不匹配并且a[i]!=a[j]
    ll mi = min(aunmatch1pos.size(),aunmatch0pos.size());
    ll mx = max(aunmatch1pos.size(),aunmatch0pos.size());
    ll ans2 = mi*y + (mx-mi)*x;// 交换a,剩下的反制
    
    mi = min(bunmatch1pos.size(),bunmatch0pos.size());
    mx = max(bunmatch1pos.size(),bunmatch0pos.size());
    ll ans3 = mi*y + (mx-mi)*x;// 交换b,剩下的反制
    
    cout << min({ans1, ans2, ans3}) << endl;
}
全部评论
同问
点赞 回复 分享
发布于 02-09 16:09 江苏

相关推荐

牛客73617529...:无端端被你骂一句
点赞 评论 收藏
分享
小鹏、大疆、米哈游、MinMax小鹏上午投的下午就约面,进度未免也太快了
蛇年行大运fff:哥们 盗贴有意思吗,我发xhs上的给你搬过来了😅😅😅
点赞 评论 收藏
分享
苍蓝星上艾露:这简历。。。可以试试我写的开源简历优化工具https://github.com/weicanie/prisma-ai
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务