社区讨论

关于memcpy、sizeof使用求助

P9868[NOIP2023] 词典参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@miiizaqn
此快照首次捕获于
2025/11/28 15:12
3 个月前
此快照最后确认于
2025/11/29 14:55
3 个月前
查看原帖
AC code
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=3010;
int n,m;
char s1[N][N],s2[N][N];
bool cmp(int u,int v){
    for(int i=1;i<=m;i++){
        if(s1[u][i]!=s2[v][i])return s1[u][i]<s2[v][i];
    }
    return false;
}
bitset<N>b;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%s",s1[i]+1);
        sort(s1[i]+1,s1[i]+1+m);
        memcpy(s2[i]+1,s1[i]+1,m);//没错就是这里
        reverse(s2[i]+1,s2[i]+1+m);
    }
    for(int i=1;i<=n;i++){
        b[i]=1;
        for(int j=1;j<=n;j++){
            if(i==j)continue;
            if(!cmp(i,j)){
                b[i]=0;
                break;
            }
        }
    }
    for(int i=1;i<=n;i++){
        if(b[i])putchar('1');
        else putchar('0');
    }
    putchar('\n');
    return 0;
}
WA code
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=3010;
int n,m;
char s1[N][N],s2[N][N];
bool cmp(int u,int v){
    for(int i=1;i<=m;i++){
        if(s1[u][i]!=s2[v][i])return s1[u][i]<s2[v][i];
    }
    return false;
}
bitset<N>b;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%s",s1[i]+1);
        sort(s1[i]+1,s1[i]+1+m);
        memcpy(s2[i]+1,s1[i]+1,sizeof (s1[i]+1));//没错就是这里
        reverse(s2[i]+1,s2[i]+1+m);
    }
    for(int i=1;i<=n;i++){
        b[i]=1;
        for(int j=1;j<=n;j++){
            if(i==j)continue;
            if(!cmp(i,j)){
                b[i]=0;
                break;
            }
        }
    }
    for(int i=1;i<=n;i++){
        if(b[i])putchar('1');
        else putchar('0');
    }
    putchar('\n');
    return 0;
}
这两份代码有且只有我注释标出来的memcpy里的第三个参赛不同,语义在我看来都是一样的但是不知道为什么结果不同(WA代码有70pts,我将错误数据下回来后发现执行了memcpy后s2数组没有变,但是我用别的数据s2数组是会变的)
万思不得其解求巨佬解答

回复

6 条回复,欢迎继续交流。

正在加载回复...