BZOJ 1142 POI2009 Tab Hash

题目大意:给定两个矩阵,保证矩阵内所有元素都不相同,求第一个矩阵通过交换行和列是否可以得到第二个矩阵

令每一行的哈希值为这一行的元素排序后的RK哈希值,将行按照哈希值排序

然后把每一列按顺序哈希一下,排个序取RK哈希作为整个矩阵的哈希值

判断两个矩阵的哈希值是否相等即可

由于矩阵中元素不重复所以可以保证第一步的哈希值不会出现重复

然后。。。我都写完了它告诉我是2B题????

算了反正POI官网上能过就是了= =

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 1010
#define BASE1 999911657
#define BASE2 999911659
using namespace std;
int m,n;
int a[M][M],b[M][M];
unsigned long long Calculate()
{
	int i,j;
	static pair<unsigned long long,int> c[M];
	for(i=1;i<=m;i++)
	{
		static int temp[M];
		for(j=1;j<=n;j++)
		{
			scanf("%d",&a[i][j]);
			temp[j]=a[i][j];
		}
		sort(temp+1,temp+n+1);
		c[i]=make_pair(0ull,i);
		for(j=1;j<=n;j++)
			(c[i].first*=BASE1)+=temp[j];
	}
	sort(c+1,c+m+1);
	for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
			b[i][j]=a[c[i].second][j];
	static unsigned long long d[M];
	for(j=1;j<=n;j++)
	{
		d[j]=0;
		for(i=1;i<=m;i++)
			(d[j]*=BASE1)+=b[i][j];
	}
	sort(d+1,d+n+1);
	unsigned long long re=0;
	for(i=1;i<=n;i++)
		(re*=BASE2)+=d[i];
	return re;
}
int main()
{
	int T;
	for(cin>>T;T;T--)
	{
		cin>>m>>n;
		unsigned long long hash1=Calculate();
		unsigned long long hash2=Calculate();
		puts(hash1==hash2?"TAK":"NIE");
	}
	return 0;
}
时间: 2024-10-08 20:58:24

BZOJ 1142 POI2009 Tab Hash的相关文章

BZOJ 1142: [POI2009]Tab

1142: [POI2009]Tab Time Limit: 40 Sec  Memory Limit: 162 MBSubmit: 213  Solved: 80[Submit][Status][Discuss] Description 2个n*m矩阵,保证同一个矩阵中元素两两不同.问能否通过若干次交换两行或交换两列把第一个矩阵变成第二个. Input 第一行正整数 T (1≤T≤10) 表示数据组数. 每组数据包括:第一行n m (1≤n,m≤1000) 2个n行m列的整数矩阵,元素绝对值均

BZOJ 1142 [POI2009]Tab 模拟

题意:链接略 方法:模拟 解析: 首先如果您做过高三那么您一定清楚,一个矩阵通过任意行列变换后得到的矩阵满足一种性质:原来在哪一行的元素还在那一行,原来在哪一列的元素还在那一列. 并且行列内部元素可以任意交换. 所以暴力验证即可. 代码附带5K读入优化,怒艹BZOJrnk1 代码: #include<cstdio> #include<cstring> #include<cctype> #include<cstdarg> #include <iostre

BZOJ 3790 神奇项链 hash/后缀自动机+贪心

Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字母组成的字符串,每个小写字母表示一种颜色. 为了制作这个项链,小 H 购买了两个机器.第一个机器可以生成所有形式的回文串,第二个机器可以把两个回文串连接起来,而且第二个机器还有一个特殊的性质:假如一个字符串的后缀和一个字符串的前缀是完全相同的,那么可以将这个重复部分重叠.例如:aba和aca连接起来,可以生成串abaaca或 abaca. 现在给出目标项链的样式,询问你需要使用第二个机器多少次才

bzoj 1014 LCP 二分 Hash 匹配

求同一字符串的两个后缀的最长公共前缀. 将字符串按位置放到Splay中维护(每个节点还维护一下该子树的hash),然后二分前缀的长度,用splay计算出指定范围的hash,按hash是否相等来判断是否相同. 一开始是将字符串看成26进制,加上unsigned long long的自然溢出来计算哈希,但这样Wa掉了,改成27进制就AC了,但我还不知道为什么,望明者相告,谢. 1 /***********************************************************

BZOJ 1115: [POI2009]石子游戏Kam

1115: [POI2009]石子游戏Kam Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 924  Solved: 574[Submit][Status][Discuss] Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. Input 第一行u表示数据组数.对于每组数据,第一行

BZOJ 1137: [POI2009]Wsp 岛屿 半平面交

1137: [POI2009]Wsp 岛屿 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 165  Solved: 78[Submit][Status][Discuss] Description Byteotia岛屿是一个凸多边形.城市全都在海岸上.按顺时针编号1到n.任意两个城市之间都有一条笔直的道路相连.道路相交处可以自由穿行.有一些道路被游击队控制了,不能走,但是可以经过这条道路与未被控制的道路的交点.问

BZOJ 2085 [Poi2010]Hamsters Hash+倍增floyd

题意:链接 方法: Hash+倍增floyd 解析: 首先这个BZ的无脑翻译我真是受不了. 加俩条件 所有串的长度总和不超过100000,并且对于任意不同子串A,B,A不包含于B,B不包含于A. 然后可以做题了. 首先,我们可以暴力hash搞出来如果i串后面接j串则需要增加多少长度. 这个n非常的小所以直接开数组记录. 然后就是倍增floyd了. 至于前半部分为什么是复杂度可以接受的. 参见PoPoQQQ的证明,总之我们要求的 ∑∑(min(leni,lenj))的函数的最大化时,复杂度是O(l

BZOJ 3198 Sdoi2013 spring Hash+容斥原理

题目大意:给定n个元素,每个元素是一个六元组,求有多少对元素满足相同的位置恰好有k个 首先对于恰好有K个这种东西果断考虑容斥原理 我们2^6枚举相同的位置 恰好有k个元素相同的对数=至少有k个位置相同的对数-至少有k+1个位置相同的对数+至少有k+2个位置相同的对数-- 但是我们计数时会发现一些问题 比如下面这组样例显然是0: 2 3 1 2 3 4 5 5 1 2 3 4 6 6 但是这一对元素被加了C(4,3)次,只被减掉了C(4,4)次 因此我们将公式改成这样: 恰好有k个元素相同的对数=

bzoj 1138: [POI2009]Baj 最短回文路 dp优化

1138: [POI2009]Baj 最短回文路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 161  Solved: 48[Submit][Status] Description N个点用M条有向边连接,每条边标有一个小写字母. 对于一个长度为D的顶点序列,回答每对相邻顶点Si到Si+1的最短回文路径. 如果没有,输出-1. 如果有,输出最短长度以及这个字符串. Input 第一行正整数N和M ( 2 ≤ N ≤ 400 , 1 ≤ M ≤