Educational Codeforces Round 25 D Suitable Replacement 贪心

来源:互联网 发布:seo by yoast 编辑:程序博客网 时间:2024/06/02 04:29

CF传送门

题意:

1. 有s和t两个字符串,长度限制1e6

2. s中可能带有"?"字符,这个字符可以变换为任意字符

3. s串的任意两个相邻字符可以交换,并且这个交换次数没有限制(重点

4. 要求在s串中尽量匹配出最多的t串,输出任意一种符合要求的s串

题解:

1. 纯属字眼题啊,看上面那个重点,两句话加起来等价于可以对s串进行随意重组的意思

2. 然后再通过变换"?"来使得s串尽可能地去匹配t串(贪心嘛,尽可能多)

3. 特殊情况是当s串中没有"?"时直接打印原s串即可,由于这个情况和我的带"?"操作并没有多大冲突和时间上的耗费,我就省略了这个判断

4. 正文从这里开始:

5. 首先是搜s串(代码中的s1串)中的"?"数量,以及对非普通字母字符进行数量统计存放在数组a中

6. 然后是循环遍历t串(代码中的s2串),如果s1串有对应字符就其数量减1,否则用"?"数量代替其减1,并且把当前字符压入栈

7. 遍历s串,把其中的"?"用栈中的字符一一对应替换(任意替换,反正s串可以随意重组)


以下是我的AC代码:

#include <iostream>#include <string>#include <stack>using namespace std;int a[30];stack<char> dit;int main(){    string s1,s2;    cin >> s1 >> s2;    int sum=0;    for(unsigned int i=0;i<s1.size();i++){        if(s1[i]=='?') sum++;        else a[int(s1[i]-'a')]++;    }    while(sum>0)        for(unsigned int i=0;i<s2.size() && sum>0;i++){            if(a[int(s2[i]-'a')]) a[int(s2[i]-'a')]--;            else {sum--;dit.push(s2[i]);}        }    for(unsigned int i=0;i<s1.size();i++)        if(s1[i]=='?'){            s1[i]=dit.top();            dit.pop();        }    cout << s1 << endl;    return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 诈骗电话按了键怎么办 上海油电混合送沪牌以后怎么办? 车子被前夫砸了怎么办 老的标书丢了怎么办 拍牌照的标书掉了怎么办 上海拍到车牌后怎么办 杭州4s店车牌怎么办 天津车牌有指标想买车怎么办 上海大牌拍中了怎么办 买新车牌下不了怎么办 临沂上小学没报上名怎么办 早教中心倒闭了怎么办 企业税没交联系不上法人怎么办 企业被拉黑法人联系不到怎么办 支票根写错了怎么办 月结客户不付款怎么办 退市整理期过了怎么办 老板跑了财务负责人怎么办 在南京加入嘀嘀代驾怎么办 苹果盗刷支付宝怎么办 街电支付宝掉了怎么办 转转上号器没有苹果版的怎么办 安卓6不支持的应用怎么办 银行卡被存款机吞了怎么办 去银行卡存款机器故障怎么办 银行卡存款没有存进去怎么办 被黑网站黑钱了怎么办 饿了吗账户异常怎么办 单位里有人整你怎么办 乌鲁木齐信息采集结束后怎么办 头发很长时间不长怎么办啊 打嘟噜时间不长怎么办 阴茎勃起的时间不长怎么办 睡觉的时间不长怎么办 每次锻炼时间不长怎么办 微信好友不知道是谁怎么办 就一个软件闪退怎么办 葫芦侠修改闪退怎么办 戴尔游匣磁盘占用100怎么办 步步高家教机扫描笔不亮怎么办 社保卡手机号换了怎么办