您的位置:首页 > 产品设计 > UI/UE

【贪心】codeforces 825D Suitable Replacement

2017-07-29 19:38 357 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: