• CodeForces 1209 C. Anagram 字符串贪心


    C. Anagram
    time limit per test 1 second
    memory limit per test 256 megabytes
     

    String x is an anagram of string y, if we can rearrange the letters in string x and get exact string y. For example, strings "DOG" and "GOD" are anagrams, so are strings "BABA" and "AABB", but strings "ABBAC" and "CAABA" are not.

    You are given two strings s and t of the same length, consisting of uppercase English letters. You need to get the anagram of string tfrom string s. You are permitted to perform the replacing operation: every operation is replacing some character from the string s by any other character. Get the anagram of string t in the least number of replacing operations. If you can get multiple anagrams of string t in the least number of operations, get the lexicographically minimal one.

    The lexicographic order of strings is the familiar to us "dictionary" order. Formally, the string p of length n is lexicographically smaller than string q of the same length, if p1 = q1p2 = q2, ..., pk - 1 = qk - 1pk < qk for some k (1 ≤ k ≤ n). Here characters in the strings are numbered from 1. The characters of the strings are compared in the alphabetic order.

    Input

    The input consists of two lines. The first line contains string s, the second line contains string t. The strings have the same length (from 1to 105 characters) and consist of uppercase English letters.

    Output

    In the first line print z — the minimum number of replacement operations, needed to get an anagram of string t from string s. In the second line print the lexicographically minimum anagram that could be obtained in z operations.

    Sample test(s)
    input
    ABA
    CBA
    output
    1
    ABC
    input
    CDBABC
    ADCABD
    output
    2
    ADBADC

    解题思路:
      贪心,设定a[A..Z]为s串中字母出现次数,b[A..Z]为t串中字母出现次数,
      我们要解决两个问题: 1. 操作次数最少 2. 同样操作次数,字典序最小
      对于问题1: 串s中一个字符i , 当且仅当 a[ s[i] ] > b[ s[i] ] 的时候,我们才考虑时候替换它,若不满足此条件,我们在之后的操作只会更而外多出一次操作,
    这显然不是我们想要的。这样,我们就解决了操作次数最少问题。
      对于问题2: 在满足上面条件后,我们从[A..Z] 选择一个P, 这里有两种情况。
          一. 字符P == s[i] 此时,如果 a[ s[i] ] > 0 && b[ s[i] ] > 0 此时我们保留修改当前s[i]为P 可得到字典徐较小的结果
          二. 字符P != s[i] 此时, 如果 a[p] < b[p] ,意味着,我们需要添加p字符到串s中,所以此处需要替换操作.
      到这里,结果统计 上面的二执行的次数就是我们需要的结果了...

    参考代码:
    View Code
    #include<stdio.h>
    int n,a[255],b[255],r;
    char s[100010],t[100010];
    int main()
    {
        freopen("input.txt", "r", stdin); 
        freopen("output.txt","w", stdout);
        scanf("%s%s",s,t);
        for(int i = 0; s[i]; i++)     
            a[s[i]]++;
        for(int i = 0; t[i]; i++)     
            b[t[i]]++;
        for(int i = 'A'; i <= 'Z'; i++)     
            r+=a[i]>b[i]?a[i]-b[i]:b[i]-a[i];
        int res = 0;
        for(int i = 0; s[i]; i++) 
         if (a[s[i]]>b[s[i]])
         {
             for(int p = 'A'; p <='Z'; p++ )
                    if (p==s[i]&&a[p]>0&&b[p]>0)
                    {
                        --a[p];--b[p];
                        break;
                    }
                    else if (b[p]>a[p])
                    {
                         --a[s[i]];++a[p];s[i]=p;
                        res += 1;    
                         break;
                    }
        }
        printf("%d\n%s",res,s);
        return 0;
    }


  • 相关阅读:
    vm扩容
    手算二维离散傅里叶变换
    取消vim模式匹配的高亮
    DS DI ES SI等等
    int and Integer
    为什么超类能引用子类的对象
    voltile解析
    java集合
    疑问:无限定通配符
    layui table 导出
  • 原文地址:https://www.cnblogs.com/yefeng1627/p/2812179.html
Copyright © 2020-2023  润新知