大致题意:
在n (n<100000)个雪花中判断是否存在两片完全相同的雪花,每片雪花有6个角,每个角的长度限制为1000000
两片雪花相等的条件:
雪花6个角的长度按顺序相等(这个顺序即可以是顺时针的也可以是逆时针的)
1 //哈希函数 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 #include<algorithm> 6 const int INF=1000007; 7 int flag,t; 8 int hash[INF]; 9 10 int s[INF][6]; 11 int st[INF][6]; 12 int next[INF]; 13 int hah(int st[]) 14 { 15 long long u=0; 16 for(int i=0;i<6;i++) 17 u=u*10+st[i]; 18 return u%INF; 19 } 20 int try_cmp(int s) 21 { 22 int h=hah(st[s]); 23 for(int i=hash[h];i!=-1;i=next[i]) 24 { 25 if(memcmp(st[i],st[s],sizeof(st[s]))==0)//比较是否被标记,若是,返回0; 26 return 0; 27 } 28 next[s]=hash[h]; 29 hash[h]=s; 30 return 1; 31 32 } 33 void sow() 34 { 35 36 for(int i=0;i<6;i++) 37 scanf("%d",&s[0][i]);//输入第一组数据,不许对比 38 std::sort(s[0],s[0]+6); 39 memcpy(st[0],s[0],sizeof(s[0])); 40 try_cmp(0); 41 for(int j=1;j<t;j++)//从输入第二组数据开始,检验是否在数组中有标记,若有,则发现相同雪花,否则,将其标记 42 { 43 for(int i=0;i<6;i++) 44 scanf("%d",&s[j][i]); 45 std::sort(s[j],s[j]+6); 46 memcpy(st[ j],s[j],sizeof(s[j])); 47 if(!try_cmp(j)) 48 flag=1; 49 } 50 if(flag) 51 printf("Twin snowflakes found. "); 52 else printf("No two snowflakes are alike. "); 53 } 54 int main() 55 { 56 while(~scanf("%d",&t)) 57 { 58 flag=0; 59 memset(hash,-1,sizeof(hash)); 60 sow(); 61 } 62 return 0; 63 }