学会写hash函数的好题目。这里采用的是最常见的 sum(key)%N 作为哈希函数,用vector来处理冲突。网上还有很多哈希函数,建议去看看。不过觉得这题有点卡哈希函数相同时判断具体的六个值是否相同。。。(wa、tle都有过,只好借用了神人的比较函数了。。。。。)
以下是代码:
- #include<cstdio>
#include<vector>
using namespace std;
const int M=10000;
const int N=9997; - struct node
{
int a[10];
__int64 sum;
};
vector<node> vec[M];
int n; - bool compare(node n1,node n2)
{
int i,j;
for(i=0;i<6;i++)
{
if(n1.a[0]==n2.a[i])
{
for(j=1;j<6;j++)
{
if(n1.a[j]!=n2.a[(i+j)%6])
break;
}
if(j==6) return 1;
for(j=1;j<6;j++)
{
if(n1.a[6-j]!=n2.a[(i+j)%6])
break;
}
if(j==6) return 1;
}
}
return 0;
} - bool check(int i)
{
int j,k;
for(j=0;j<vec[i].size();j++)
for(k=j+1;k<vec[i].size();k++)
{
if(vec[i][j].sum==vec[i][k].sum && compare(vec[i][j],vec[i][k]))
return 1;
}
return 0;
} - int main()
{
node sn;
scanf("%d",&n);
int i,j;
bool flag=false;
for(i=0;i<n;i++)
{
sn.sum=0;
for(j=0;j<6;j++)
{
scanf("%d",&sn.a[j]);
sn.sum+=sn.a[j];
}
if(i==0)
vec[sn.sum%N].push_back(sn);
else if(!flag)
{
vec[sn.sum%N].push_back(sn);
if(vec[sn.sum%N].size()>1)
{
if(check(sn.sum%N))
flag=true;
}
}
}
if(flag)
printf("Twin snowflakes found./n");
else
printf("No two snowflakes are alike./n");
return 0;
}