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;
}
posted @ 2016-07-13 22:26  see_you_later  阅读(108)  评论(0编辑  收藏  举报