哈希+挂链。可以用next数组挂链。
1 const p=99987; 2 type 3 arr=array[1..6]of longint; 4 var 5 a,b:Array[0..200000]of arr; 6 next:Array[0..200000]of longint; 7 i,j,n,has,tot:longint; 8 9 function hash(x:longint):longint; 10 var i:longint; 11 begin 12 hash:=0; 13 for i:=1 to 6 do 14 hash:=(hash*7+a[x,i]*131) mod p; 15 inc(hash); 16 end; 17 function equa(a,b:arr):boolean; 18 var i:longint; 19 begin 20 for i:=1 to 6 do 21 if a[i]<>b[i] then exit(false); 22 exit(true); 23 end ; 24 procedure sort(var a:arr); 25 var i,j,t:longint; 26 begin 27 for i:=1 to 5 do 28 for j:=i to 6 do 29 if a[j]>a[i] then 30 begin t:=a[j];a[j]:=a[i];a[i]:=t;end; 31 end; 32 33 begin 34 readln(n); 35 tot:=p+1; 36 for i:=1 to n do 37 begin 38 for j:=1 to 6 do 39 read(a[i,j]); 40 sort(a[i]); 41 has:=hash(i); 42 while (has<>0)and(not equa(b[has],b[200000])) do 43 begin 44 if equa(b[has],a[i]) then 45 begin 46 writeln('Twin snowflakes found.'); 47 halt; 48 end; 49 has:=next[has]; 50 end; 51 next[has]:=tot+1; inc(tot); 52 b[has]:=a[i]; 53 end; 54 writeln('No two snowflakes are alike.'); 55 end.