1. 程式人生 > >解題:POI 2009 TAB

解題:POI 2009 TAB

題面

這也算是個套路題(算嗎)?發現換來換去每行每列數的組成是不變的,那麼就把每行每列拎出來雜湊一下,複雜度$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\n"):printf("NIE\n"); 46 } 47 return 0; 48 }
View Code