• Codeforces 584C


    C. Marina and Vasya

    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Marina loves strings of the same length and Vasya loves when there is a third string, different from them in exactly t characters. Help Vasya find at least one such string.

    More formally, you are given two strings s1, s2 of length n and number t. Let's denote as f(a, b) the number of characters in which strings aand b are different. Then your task will be to find any string s3 of length n, such that f(s1, s3) = f(s2, s3) = t. If there is no such string, print  - 1.

    Input

    The first line contains two integers n and t (1 ≤ n ≤ 105, 0 ≤ t ≤ n).

    The second line contains string s1 of length n, consisting of lowercase English letters.

    The third line contain string s2 of length n, consisting of lowercase English letters.

    Output

    Print a string of length n, differing from string s1 and from s2 in exactly t characters. Your string should consist only from lowercase English letters. If such string doesn't exist, print -1.

    Examples
    input
    Copy
    3 2
    abc
    xyc
    output
    Copy
    ayd
    input
    Copy
    1 0
    c
    b
    output
    Copy
    -1

     题意:给出长度为n 和不同字符个数t 以及两个长度为n的字符串.f(a,b) 表示ai!=bi的和

    求一个字符串f(s1,s3)==f(s2,s3)==t

    思路:我们先构造出一个s3 它每个位置都不同于s1,s2,然后d1=d2=n-t表示需要相同的字符个数,然后直接替换s3的字符即可

    最后判断 d1 与 d2是否为0即可输出答案

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> pll;
    #define eps 1e-6
    #define pb push_back
    const int INF = 0x3f3f3f3f;
    const int maxn = 100000+5;
    const int MOD = 1e9+7;
    int f[maxn];
    int main()
    {
        int n,t;
        string a,b,s;
        cin>>n>>t;
        cin>>a>>b;
        for(int i=0; i<n; i++)
        {
            for(char c='a'; c<='z'; c++)
            {
                if(a[i]==c||b[i]==c) continue;
                s.push_back(c);
                break;
            }
        }
        int d1=n-t,d2=n-t;
        for(int i=0; i<n; i++)
        {
            if(d1==0) break;
            if(a[i]==b[i])
            {
                s[i]=a[i];
                d1--;
                d2--;
                f[i]=1;
            }
        }
        for(int i=0; i<n; i++)
        {
            if(f[i]) continue ;
            if(d1)
            {
                d1--;
                s[i]=a[i];
                f[i]=1;
            }
            else if(d2)
            {
                d2--;
                s[i]=b[i];
                f[i]=1;
            }
        }
        if(!d1&&!d2)
            cout<<s<<endl;
        else cout<<-1<<endl;
    }
    View Code

     总结:字符串构造题写得太少emm

     PS:摸鱼怪的博客分享,欢迎感谢各路大牛的指点~

  • 相关阅读:
    清除3389远程桌面连接记录的批处理
    Visual Studio Team Foundation Server 2013
    Build fast jar 打包,增加配置文件
    Asp.net MVC 出现“Failed to map the path '/'.”错误
    Java创建AD(Active Directory)域控制器用户 (未测)
    JSP/java 执行创建批处理文件,并执行批处理事务。
    域控密码策略
    项目感悟
    IE版本的标准定义
    VS编译后事件
  • 原文地址:https://www.cnblogs.com/MengX/p/9325808.html
Copyright © 2020-2023  润新知