#include<cstdio>
#define in inline
#define re register
#define int long long
in int read()
{
int s(0),b(0);char ch;
do{ch=getchar();if(ch=='-')b=1;}while(ch<'0'||ch>'9');
while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
if(b) return -s;
return s;
}
const int yyb=233333;
int n,key[233333][7],head[233333+1],nxt[233333+1],cnt;
in int clac(int x[])
{
int h=0,t=1;
for(re int i=1;i<=6;++i)
h=(h+x[i])%yyb,t=t*x[i]%yyb;
return (h+t)%yyb;
}
in bool chk(int a[],int b[])
{
int ans=0;
for(re int i=0;i<6;++i)
{
int f=1;
for(re int j=1;j<=6;++j)
if(a[(i+j-1)%6+1]!=b[j]){f=0;break;}
ans|=f;
}
for(re int i=0;i<6;++i)
{
int f=1;
for(re int j=6;j>=1;--j)
if(a[(i+(6-j+1)-1)%6+1]!=b[j]){f=0;break;}
ans|=f;
}
return ans;
}
in bool insert(int x[])
{
int h=clac(x);
++cnt;
for(re int i=1;i<=6;++i) key[cnt][i]=x[i];
for(re int i=head[h];i;i=nxt[i])
if(chk(x,key[i])) return false;
nxt[cnt]=head[h],head[h]=cnt;
return true;
}
signed main()
{
n=read();
for(re int i=1;i<=n;++i)
{
int snow[7];
for(re int j=1;j<=6;++j)
snow[j]=read();
if(!insert(snow)){printf("Twin snowflakes found.\n");return 0;}
}
printf("No two snowflakes are alike.\n");
return 0;
}
最新评论