#include<cstdio> #include<cstring> using namespace std; const int maxn=100010; const int P=100007; int head[P],cnt; int snow[maxn][6]; int n; struct node{ int to,next; }e[maxn]; void init(){ cnt=0; memset(head,-1,sizeof(head)); } void addhash(int val,int i){ e[++cnt].to=i; e[cnt].next=head[val]; head[val]=cnt; } int cmp(int a,int b){ int i,j; for(int i=0;i<6;i++){ if(snow[a][0]==snow[b][i]){ for(j=1;j<6;j ++){ //顺时针 if(snow[a][j]!=snow[b][(j + i)%6]){ break; } } if(j==6){ return 1; } for(j=1;j<6;j ++){ //逆时针 if(snow[a][6-j]!=snow[b][(j+i)%6]){ break; } } if(j==6){ return 1; } } } return 0; } bool find(int i){ int key,sum=0; for(int j=0;j<6;j ++){ sum+=snow[i][j]; } key=sum%P; for(int j=head[key];j;j = e[j].next){ if(cmp(i,e[j].to)){ return 1; } } addhash(key,i); return 0; } int main(){ scanf("%d", &n); int flag=0; int sum,key; for(int i=0;i<n;i++){ for(int j=0;j<6;j ++){ scanf("%d", &snow[i][j]); } if(find(i)){ flag=1; break; } } if(flag){ puts("Twin snowflakes found."); } else{ puts("No two snowflakes are alike."); } return 0; } /************************************************************** Problem: 2353 User: caizhihao Language: C++ Result: Accepted Time:5 ms Memory:4660 kb ****************************************************************/