哈希算法之二
//poj 3349 Snowflake Snow Snowflakes
#include<iostream> //哈希函数,拉链法
#include<vector>
using namespace std;
const int mv=99991;
int data[100002][6];
vector<int> hash[100002];
bool same(int a[6],int b[6])
//a[]的下标j总是从0到6,固定a,而b[]的起始下标i从0到6,绕顺时针(向右)和逆时针旋转
{
int tag;
for(int i=0;i<6;++i)
{
tag=0;
for(int j=0;j<6;++j)
{
if(a[j]!=b[(j+i)%6]) //b绕顺时针(向右)
{
tag=1;break;
}
}
if(tag==0)
return true;
}
for(int i=0;i<6;++i)
{
tag=0;
for(int j=0;j<6;++j)
{
if(a[j]!=b[(-j+i+6)%6]) //b绕逆时针
{
tag=1;break;
}
}
if(tag==0)
return true;
}
return false;
}
int main()
{
int n,i,j,sum;
scanf("%d",&n);
for(i=1;i<=n;++i)
for(j=0;j<6;++j)
scanf("%d",&data[i][j]);
for(i=1;i<=n;++i)
{
sum=0;
for(j=0;j<6;++j)
sum+=data[i][j];
sum%=mv;
if(hash[sum].size()>0)
{
for(j=0;j<hash[sum].size();++j)
{
int k=hash[sum][j];
if(same(data[i],data[k]))
{
printf("Twin snowflakes found.\n");
return 0;
}
}
}
hash[sum].push_back(i);
}
printf("No two snowflakes are alike.\n");
return 0;
}