zoukankan      html  css  js  c++  java
  • 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:摸鱼怪的博客分享,欢迎感谢各路大牛的指点~

  • 相关阅读:
    mysql数据库基本类型
    常用辅助类【转】
    Java 并发笔记】并发机制底层实现整理[转发]
    关于PROPAGATION_NESTED的理解
    线程数设置
    c# Expression 扩展[转]
    Net定时器 【转载】
    【转】高可用设计-58沈剑
    【转】委托的三种调用示例(同步调用 异步调用 异步回调)
    [coursera OA] acme match
  • 原文地址:https://www.cnblogs.com/MengX/p/9325808.html
Copyright © 2011-2022 走看看