1. 程式人生 > >[POI2009]Tab

[POI2009]Tab

per opera \n amp 輸出 har 整數 In Go

Description
2個n\(\times\)m矩陣,保證同一個矩陣中元素兩兩不同。問能否通過若幹次交換兩行或交換兩列把第一個矩陣變成第二個。

Input
第一行正整數T(1≤T≤10)表示數據組數.
每組數據包括:第一行nm(1≤n,m≤1000)2個n行m列的整數矩陣,
元素絕對值均在10^6以內

Output
每組數據輸出“TAK”/“NIE”表示能/不能.

Sample Input
2
4 3
1 2 3
4 5 6
7 8 9
10 11 12
11 10 12
8 7 9
5 4 6
2 1 3
2 2
1 2
3 4
5 6
7 8

Sample Output
TAK
NIE

這題隨便亂搞即可

找到第一個矩陣中的每一行應該對應第二個矩陣的某一行,然後求出置換序列,最後判斷每一行的置換序列是否一樣即可

然後找到對應的行數我就是sort+hash……反正巨蠢……

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef
unsigned int ui; typedef unsigned long long ull; inline int read(){ int x=0,f=1;char ch=getchar(); for (;ch<‘0‘||ch>‘9‘;ch=getchar()) if (ch==‘-‘) f=-1; for (;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=(x<<1)+(x<<3)+ch-‘0‘; return x*f; } inline void print(int
x){ if (x>=10) print(x/10); putchar(x%10+‘0‘); } const int N=1e3,p=1e9+7,digit=233,limit=1e6; int A[N+10][N+10],B[N+10][N+10],_A[N+10][N+10],_B[N+10][N+10]; int cnt[(limit<<1)+10],pol[N+10]; struct S1{ int hash,ID; void insert(int a,int b){hash=a,ID=b;} bool operator <(const S1 &x)const{return hash<x.hash;} }HA[N+10],HB[N+10]; int n,m; int Hash(int *a){ int res=0; for (int i=1;i<=m;i++) res=(1ll*res*digit+a[i])%p; return res; } void work(){ n=read(),m=read(); for (int i=1;i<=n;i++){ for (int j=1;j<=m;j++) A[i][j]=_A[i][j]=read()+limit; sort(_A[i]+1,_A[i]+1+m); HA[i].insert(Hash(_A[i]),i); } for (int i=1;i<=n;i++){ for (int j=1;j<=m;j++) B[i][j]=_B[i][j]=read()+limit; sort(_B[i]+1,_B[i]+1+m); HB[i].insert(Hash(_B[i]),i); } sort(HA+1,HA+1+n),sort(HB+1,HB+1+n); for (int i=1;i<=n;i++) if (HA[i].hash!=HB[i].hash){printf("NIE\n");return;} for (int i=1;i<=m;i++) cnt[B[HB[1].ID][i]]=i; for (int i=1;i<=m;i++) pol[i]=cnt[A[HA[1].ID][i]]; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (A[HA[i].ID][j]!=B[HB[i].ID][pol[j]]){printf("NIE\n");return;} printf("TAK\n"); } int main(){ for (int Data=read();Data;Data--) work(); return 0; }

[POI2009]Tab