点击打开链接
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int N = 100005;
const int M = 10;
const int mod = 100003;
int head[N], num, a[M], snow[N][M];
struct node
{
int pos, next;
}e[N];
void hash(int val, int pos)
{
e[num].pos = pos;
e[num].next = head[val];
head[val] = num++;
}
int check(int a, int b)
{
int i, j;
for(i=0; i<6; ++i)
{
j=0;
while(j<6&&snow[a][(i+j)%6]==snow[b][j])
j++;
if(j==6)
return 1;
j=0;
while(j<6&&snow[a][5-(i+j)%6]==snow[b][j])
j++;
if(j==6)
return 1;
}
return 0;
}
int readint()
{
int res=0,ch;
while(!((ch=getchar())>='0'&&ch<='9'))
{
if(ch==EOF) return 1<<30;
}
res=ch-'0';
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch-'0');
return res ;
}
int find(int n)
{
int i, j, val, pos;
val = ((snow[n][0]+snow[n][2]+snow[n][4])^(snow[n][1]+snow[n][3]+snow[n][5]) )% mod;
for(i=head[val]; ~i; i=e[i].next)
{
pos =e[i].pos;
if(check(n, pos))
return 1;
}
hash(val, n);
return 0;
}
int main()
{
int i, j, n, val, pos, flag;
while(~scanf("%d", &n))
{
flag = 0;
num = 0;
memset(head, -1, sizeof head );
for(i=1; i<=n; ++i)
{
for(j=0; j<6; ++j)
snow[i][j] = readint();
if(flag)
continue;
if(find(i))
flag = 1;
}
if(flag)
printf("Twin snowflakes found.\n");
else
printf("No two snowflakes are alike.\n");
}
return 0;
}