矩阵a的每一列和矩阵b的每一列一一对应即可。

#include <bits/stdc++.h>
using namespace std;
const int N=400005, mo=1e9+7;
int n, m, i, j, k, s;
char a[N];
map <int, int> f;
int main(){
    scanf("%d%d", &n, &m);
    for(i=0; i<n; i++){
        scanf("%s", a+m*i);
    }
    for(j=0; j<m; j++){
        for(s=0, i=0; i<n; i++){
            s = s*771ll + a[m*i+j] % mo;
        }
        f[s]++;//字符串a每一列哈希值统计
    }
    for(i=0; i<n; i++){
        scanf("%s", a+m*i);
    }
    for(j=0; j<m; j++){
        for(s=0, i=0; i<n; i++){
            s = s*771ll + a[m*i+j] % mo;
        }
        if(--f[s] < 0) i = j = N;//出现新的或者不够无解
    }
    printf("%s\n", i<N?"Yes":"No");
    return 0;
}
#include <bits/stdc++.h>
#define N 400005
using namespace std;
int n, m, i, j, k, p[N], q[N];
char a[N], b[N];
int cmpa(int i, int j){
    for(k=0; k<n; k++){
        if(a[m*k+i] != a[m*k+j]){
            return a[m*k+i] == '#';
        }
    }
    return 0;
}
int cmpb(int i, int j){
    for(k=0; k<n; k++){
        if(b[m*k+i] != b[m*k+j]){
            return b[m*k+i] == '#';
        }
    }
    return 0;
}
int main(){
    scanf("%d%d", &n, &m);
    for(i=0; i<n; i++){
        scanf("%s", a+m*i+1);
    }
    for(i=0; i<n; i++){
        scanf("%s", b+m*i+1);
    }
    for(i=1; i<=m; i++){
        p[i] = q[i] = i;
    }
    sort(p+1, p+m+1, cmpa);//按照列索引排序
    sort(q+1, q+m+1, cmpb);
    for(i=0; i<n; i++){
        for(j=1; j<=m; j++){
            if(a[i*m+p[j]] != b[i*m+q[j]]){
                i = j = N;
            }//排序后每一列相等
        }
    }
    printf("%s\n", i<N?"Yes":"No");
    return 0;
}

有同学直接判断行、列#数量一样就过了;更有同学直接判断行数量一样就过了,数据有点太水。

作者 crxis

发表回复