【貪心】codeforces 825D Suitable Replacement

CN_swords發表於2017-07-29

Link:http://codeforces.com/problemset/problem/825/D

#include <bits/stdc++.h>
using namespace std;

/*
codeforces 825D
題意:給兩個字串,第一個字串帶有'?',可以變成任何一個字元,
並且第一個字串的字元位置可以任意交換,問第一個字元是怎麼樣的才能使,
第二個字元在第一個字元中存在(非交叉)次數最多。
題解:貪心,反正可以任意交換,而且字元非交叉,我一個一個組第二個字串,
需要什麼字元,如果第一個字串裡有,拿過來,沒有用'?'去代替即可。
記錄'?'代表的字元。
*/
const int Maxn = 1e6+6;
char s[Maxn],p[Maxn];
int mp[27];
char res[Maxn];
int main(){
    scanf("%s%s",s,p);
    int len = strlen(s);
    int num = 0;
    for(int i = 0; i < 26; i++)
        mp[i] = 0;
    for(int i = 0; i < len; i++){
        if(s[i] == '?') num++;
        else    mp[s[i]-'a']++;
    }
    int lenp = strlen(p);
    int k = 0;
    while(1){
        int flag = 0;
        for(int i = 0; i < lenp; i++){
            if(mp[p[i]-'a'] > 0)
                mp[p[i]-'a'] --;
            else{
                if(num > 0){
                    res[k++] = p[i];
                    num--;
                }
                else{
                    flag = 1;
                    break;
                }
            }
        }
        if(flag)    break;
    }
    k = 0;
    for(int i = 0; i < len; i++){
        if(s[i] == '?')
            printf("%c",res[k++]);
        else
            printf("%c",s[i]);
    }
    puts("");
    return 0;
}


相關文章