[POI2009]Tab

Posted Wolfycz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[POI2009]Tab相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

1139: [POI2009]Wie

[POI2009]石子游戏Kam

BZOJ1135: [POI2009]Lyz

Android:使用Tab检测单个片段viewpager

Android选项卡片段不调用OnCreateView从tab2切换到tab1

在 Visual Studio 中创建构造函数的代码片段或快捷方式