___Segment___ @ 2024-08-05 18:15:39
#include<bits/stdc++.h>
using namespace std;
int main() {
string a,b;
int n,m,k=0;
cin>>n>>m>>a>>b;
int cnt=0;
for(int i=0;i<n;i++) {
if(b[i]=='#') cnt++;
}
if(cnt<25) {
for(int i=0;i<n;i++) {
if(a[i]=='#') a[i]=(++k-1)%26+'a';
}
}
else {
int ki=cnt/25;
int i;
for(i=0;i<n&&ki>0;i++) {
if(a[i]=='#') {
a[i]='a';
ki--;
}
}
for(i=0;i<n;i++) {
if(a[i]=='#') a[i]=(++k-1)%26+'a';
}
}
cout<<a;
return 0;
}
by qfy123 @ 2024-08-06 09:54:17
Hack:
输入:
30 60
##############################
##############################
正确输出:
aabcdefghijklmnopqrstuabcdefgh
你的输出:
aabcdefghijklmnopqrstuvwxyzabc
原因是,字符串
by qfy123 @ 2024-08-06 10:04:05
@chenrongqing 具体而言,对于这个样例来说,在前面两个 a
填完后
v
。vwxyz
填入字符串 a
。由于 v
的字典序比 a
大,因此第二种选择是更优的。
by ___Segment___ @ 2024-08-06 10:10:12
@qfy123 那么在我的代码里该如何处理?
by qfy123 @ 2024-08-06 10:18:36
@chenrongqing 一种可能的改法,你往
by qfy123 @ 2024-08-06 10:25:01
在这个判断里面的 for 循环要实现从 a
填到第 26 - cnt % 25
个字母,然后跳出循环。
by ___Segment___ @ 2024-08-06 10:33:05
@qfy123
if(cnt%25!=0) {
for(int i=0,j=1;i<n&&j<=26-cnt%25;i++) {
if(a[i]=='#') {
a[i]=(++k-1)%26+'a';
j++;
}
}
}
似乎有点小问题?
by qfy123 @ 2024-08-06 10:41:51
首先,你那个 k 要重新赋值为 0,不然这层循环白搞了。
if(cnt%25!=0) {
for(int i=0,j=1;i<n&&j<=26-cnt%25;i++) {
if(a[i]=='#') {
a[i]=(++k-1)%26+'a';
j++;
}
}
k = 0;
}
然后,你在 cnt < 25 的那一部分也把这一部分代码放在那第一个 for 循环之前
by qfy123 @ 2024-08-06 10:44:10
@chenrongqing 这样应该就是满分了。
by ___Segment___ @ 2024-08-06 10:44:57
@qfy123 谢大佬,已关注。