Oldxu114514 @ 2024-08-04 11:04:54
#include<bits/stdc++.h>
using namespace std;
string a,b;
int n,m;
int cnt;
int main(){
cin>>n>>m>>a>>b;
for(int i=0;i<n;i++)
{
if(a[i]=='#' && m>0)
{
cnt++;
a[i]='a'+((cnt-1)%26);
m--;
}
}
cout<<a<<endl;
return 0;
}
by liaocr @ 2024-08-04 11:22:06
@Oldxu114514 emm 这题能拿60也算奇迹了 从头讲一下思路 这题里字符串b的作用就是借助b字符串里的‘#’跳过一些字母 而你这了里没有用到 所以要先用cnt1统计b字符串里面‘#’的个数代码如下
for(int i=0;i<n;i++){
if(b[i]=='#'){
++cnt1;
}
}
第二步 遍历a字符串,用一个now记录当前应该输出什么 当遇到‘#’时 要做一个判断 我们这道题要求他字典序最小 有两种情况 就是借助b里的‘#’能让他这一位输出‘a'的 还有不能的 我们就是要判断能不能输出‘a’ 条件就是cnt1+now>=26 之后cnt1的个数要看now的数值而减少 注意这里有一个坑 当now本来就是输出‘a’时没有必要再去用b的‘#’ 所以要加另一个条件 代码如下
for(int i=0;i<n;i++){
if(a[i]=='#'){
if(now+cnt1>=26&&now!=0)
{
cout << 'a';
cnt1-=(26-now);
now = 1;
}
else
{
cout << l[now];
now++;
now%=26;
}
}
else
{
cout<<a[i];
}
}
这样之后就能AC了 附上AC代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
string a,b;
char l[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int main(){
int cnt1=0,f=0;
cin>>n>>m>>a>>b;
int now = 0;
for(int i=0;i<n;i++){
if(b[i]=='#'){
++cnt1;
}
}
for(int i=0;i<n;i++){
if(a[i]=='#'){
if(now+cnt1>=26&&now!=0)
{
cout << 'a';
cnt1-=(26-now);
now = 1;
}
else
{
cout << l[now];
now++;
now%=26;
}
}
else
{
cout<<a[i];
}
}
return 0;
}
这是我第4次看到有人求助这道了 上面的这段也是之前我帮人写的 我就改了下 如果有啥不对数组名字对不上啥的 忽视就好 最后的AC代码测过了没有问题 可以的话给个关注吧qwq
by Oldxu114514 @ 2024-08-04 11:23:06
@liaocr 谢谢!!!