POJ 3349
本题哈希,但judge的时间还是很长,哎;
#include <stdio.h> #include <memory.h> #define maxn 100003 struct s{ int arms[6]; int amount; }snow[maxn]; int head[maxn],next[maxn];//maxn大小的哈希表 int judge(int *a,int *b) { int i,j,ok=1,t=0; int k[6]; for(i=0;i<6&&ok;i++) { for(j=0;j<6;j++) { if(a[i]==b[j]) { ok=0; k[t++]=j; } } } if(t==0) return 0; for(;t>=0;t--){ for(i=1;i<6;i++)//顺时针 { if(a[i]!=b[(i+k[t])%6]) break; } if(i==6) return 1; for(i=1;i<6;i++)//逆时针 { if(a[i]!=b[(k[t]-i+6)%6]) break; } if(i==6) return 1; } return 0; } int insert(int i) { int loc=(snow[i].amount)%maxn;//哈希函数 int u=head[loc]; while(u!=-1) { if((snow[u].amount==snow[i].amount)&&judge(snow[u].arms,snow[i].arms)) return 1; u=next[u]; } next[i]=head[loc]; head[loc]=i; return 0; } int main() { int n; while(scanf("%d",&n)!=EOF){ int flag=0; memset(head,-1,sizeof(head)); int i,j; for(i=0;i<n;i++) { snow[i].amount=0; for(j=0;j<6;j++) { scanf("%d",&snow[i].arms[j]); snow[i].amount=snow[i].amount+snow[i].arms[j];//key关键字 } if(insert(i)) flag=1; } if(flag) printf("Twin snowflakes found.\n"); else printf("No two snowflakes are alike.\n"); } return 0; }