BZOJ 1142 POI2009 Tab Hash
2015-04-01 10:40
260 查看
题目大意:给定两个矩阵,保证矩阵内所有元素都不相同,求第一个矩阵通过交换行和列是否可以得到第二个矩阵
令每一行的哈希值为这一行的元素排序后的RK哈希值,将行按照哈希值排序
然后把每一列按顺序哈希一下,排个序取RK哈希作为整个矩阵的哈希值
判断两个矩阵的哈希值是否相等即可
由于矩阵中元素不重复所以可以保证第一步的哈希值不会出现重复
然后。。。我都写完了它告诉我是2B题????
算了反正POI官网上能过就是了= =
令每一行的哈希值为这一行的元素排序后的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; }
相关文章推荐
- bzoj 1142: [POI2009]Tab 乱搞
- BZOJ1142: [POI2009]Tab
- [乱搞 暴力] BZOJ 1142 [POI2009]Tab
- BZOJ 1142 [POI2009]Tab 模拟
- 【BZOJ1142】【POI2009】Tab 乱搞
- BZOJ 1142: [POI2009]Tab 模拟
- BZOJ 1142: [POI2009]Tab
- BZOJ 1142: [POI2009]Tab【并查集/hash
- 【bzoj1133】[POI2009]Kon
- bzoj 1414 && bzoj 3705: [ZJOI2009]对称的正方形(二维Hash)
- BZOJ1133: [POI2009]Kon
- 【BZOJ】1119: [POI2009]SLO
- BZOJ 1141 POI2009 Slw
- [BZOJ]1414: [ZJOI2009]对称的正方形 二分+hash
- 【BZOJ 1115】 [POI2009]石子游戏Kam
- BZOJ1138: [POI2009]Baj 最短回文路
- 【BZOJ2803】【Poi2012】Prefixuffix hash+推性质
- 【BZOJ】【P1135】【POI2009】【Lyz】【题解】【线段树+Hall定理】
- bzoj2790 [Poi2012]A Horrible Poem(hash+枚举)
- BZOJ 1133 [POI2009]Kon DP