T4

· · 个人记录

给大家分析一下@god_std的T4代码:

他的:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;char s[1000999],t[1000999]; 
bool cmp(char a,char b){return a>b;}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>s[i];
    for(int i=1;i<=m;i++)cin>>t[i];
    char c=t[m];int it=1;bool flag=1;
    sort(t+1,t+m+1,cmp);
    for(int i=1;i<=n;i++)if(it<=m&&s[i]<t[it])s[i]=t[it],it++;
    for(int i=1;i<=n;i++)if(s[i]==c)flag=0;
    if(flag==1)s[n]=c;
    for(int i=1;i<=n;i++)cout<<s[i];
    return 0;
} 

@chenxi2009 的(去注释):

#include<bits/stdc++.h>
using namespace std;
int n,m,it;
char s[2000000],t[2000000],c;
bool u;
int main(){
    scanf("%d%d%s%s",&n,&m,s + 1,t + 1);
    c = t[m];
    sort(t + 1,t + m + 1);
    it = m;
    for(int i = 1;i <= n;i ++) if(it && t[it] > s[i]) s[i] = t[it --];
    for(int i = 1;i <= n;i ++) if(s[i] == c) u = true;
    if(!u) s[n] = c;
    for(int i = 1;i <= n;i ++) printf("%c",s[i]);
    return 0;
}

变量名

s,t,n,m 就不说了,c、it 的赋值都变成了直接赋,名称未改;u 改成了 flag,赋值 true 改成了 0(也就是flag是和题解相反的)。数组少开了几项。

算法

完全一致,就是把整个 t 反了过来,稍微改一下 t[i] 的取值方法。

I/O

scanf/printf 改成了 cin/cout。

其余

定义、赋值的位置全部与题解不同,显然是故意为了让代码看起来和题解不像。且进行了一些不必要的压行,显得代码和题解不同。用了 #define int long long,完全不必要,因为这题数据很小,明显是在掩饰。

总结

抄题解概率 101%,请 @god_std 尽快作出解释!