这也算是个套路题(算吗)?发现换来换去每行每列数的组成是不变的,那么就把每行每列拎出来哈希一下,复杂度$O(Tn^2log$ $n)$有点卡时=。=。
然而正解似乎不需要哈希,就像这样↓
1 for(int i=1;i<=n;i++) 2 for(int j=1;j<=m;j++){ 3 int xxx=read(); 4 x[xxx+A]=i; 5 y[xxx+A]=j; 6 } 7 bool b=true; 8 for(int i=1;i<=n;i++){ 9 for(int j=1;j<=m;j++){ 10 a[i][j]=read(); 11 if(x[a[i][j]+A]!=x[a[i][1]+A]||x[a[i][j]+A]==0)b=false; 12 if(y[a[i][j]+A]!=y[a[1][j]+A]||y[a[i][j]+A]==0)b=false; 13 } 14 }
(来自洛谷题解,侵删)

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define ull unsigned long long 5 using namespace std; 6 const int N=1005,P=1e6; 7 const long long bas=2332333; 8 ull tmp[N],hsh[2][2*N]; 9 int mapp[N][N],n,m,T; 10 int main () 11 { 12 register int i,j,k; 13 scanf("%d",&T); 14 while(T--) 15 { 16 scanf("%d%d",&n,&m); 17 memset(hsh,0,sizeof hsh); 18 for(k=0;k<=1;k++) 19 { 20 for(i=1;i<=n;i++) 21 for(j=1;j<=m;j++) 22 scanf("%d",&mapp[i][j]),mapp[i][j]+=P; 23 for(i=1;i<=n;i++) 24 { 25 for(j=1;j<=m;j++) 26 tmp[j]=mapp[i][j]; 27 sort(tmp+1,tmp+1+m); 28 for(j=1;j<=m;j++) 29 hsh[k][i]=hsh[k][i]*bas+tmp[j]; 30 } 31 for(i=1;i<=m;i++) 32 { 33 for(j=1;j<=n;j++) 34 tmp[j]=mapp[j][i]; 35 sort(tmp+1,tmp+1+n); 36 for(j=1;j<=n;j++) 37 hsh[k][i+n]=hsh[k][i+n]*bas+tmp[j]; 38 } 39 } 40 sort(hsh[0]+1,hsh[0]+1+n+m); 41 sort(hsh[1]+1,hsh[1]+1+n+m); 42 bool f=true; 43 for(i=1;i<=n+m&&f;i++) 44 if(hsh[0][i]!=hsh[1][i]) f=false; 45 f?printf("TAK "):printf("NIE "); 46 } 47 return 0; 48 }