zoukankan      html  css  js  c++  java
  • Codeforces Round #324 (Div. 2)C. Marina and Vasya

    A的万般无奈。。。后来跑了大牛的这份代码发现,
    题意是求一个序列与给定的两个序列有t个不同。
    只要保证。。。对应位置就行了。。
    所以处理起来非常方便。。。。。。。。。。。。。。
    可是没有感觉是对应位置啊瞎几把想了一堆。后来真的是。
    再后来?
    我觉得非常好的就是又多了那么点见识。。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    typedef unsigned long long ULL;
    const double eps=1e-5;
    const double pi=acos(-1.0);
    const int mod=1e9+7;
    const int INF=0x3f3f3f3f;
    
    const int N=1e5+7;
    bool status[N];
    
    char Generate(char a,char b)
    {
        char tmp;
        for(int i=0;i<26;i++)
        {
            tmp='a'+i;
            if(tmp!=a&&tmp!=b){
                return tmp;
            }
        }
    }
    
    int cout_dif(string a,string b,int len)
    {
        int res=0;
        for(int i=0;i<len;i++){
            if(a[i]!=b[i])
                res++;
        }
        return res;
    }
    
    int main()
    {
        int n,t,dif=0;
        string a,b,c;
        cin>>n>>t;
        cin>>a>>b;
        c=string(n,'a');
        vector<int>pos;
        memset(status,0,sizeof(status));
        for(int i=0;i<n;i++){
            if(a[i]!=b[i])          // 统计给定两串的不同字符数为x。【这样特么就能统计???】
                dif++;
            else
                status[i]=1;        //标记共同的
        }
        if(t==dif){
            for(int i=0;i<n;i++){
                if(status[i]){      //如果是共同的取好
                    c[i]=a[i];
                }
                else                //不同直接取个更加不同的
                    c[i]=Generate(a[i],b[i]);
            }
        }
        else if(t>dif){
            int cnt=0;                  //作为标记掉,用来考虑相同里面的t-dif那部分。
            for(int i=0;i<n;i++)
            {
                if(status[i]){
                    if(cnt<(t-dif))
                    {
                        c[i]=Generate(a[i],b[i]);
                        cnt++;
                    }
                    else
                        c[i]=a[i];
                }
                else{               //还是要把不同个取个更加不同的
                    c[i]=Generate(a[i],b[i]);
                }
            }
        }
        else            //保持相同部分不变,另挑(x-t)个原不同位置,使之与a串相同//同理,b串。
        {
            int cnt1=0,cnt2=0;
            for(int i=0;i<n;i++){
                if(status[i])
                    c[i]=a[i];
                else{
                    if(cnt1<(dif-t)){
                        c[i]=a[i];
                        cnt1++;
                    }
                    else if(cnt2<(dif-t)){
                        c[i]=b[i];
                        cnt2++;
                    }
                    else
                        c[i]=Generate(a[i],b[i]);
                }
            }
        }
        if(cout_dif(a,c,n)==t&&cout_dif(b,c,n)==t)
            cout<<c<<endl;
        else
            cout<<"-1"<<endl;
        return 0;
    }
    
  • 相关阅读:
    Cmder配置
    uboot移植
    嵌入式产品开发技术问题
    flexbox布局
    使用PS过程
    STM32 使用 FreeRTOS过程记录
    TTL、RS232、RS485、串口
    用纯css改变下拉列表select框的默认样式
    task9暂存
    Hello World
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934446.html
Copyright © 2011-2022 走看看