http://acm.pku.edu.cn/JudgeOnline/problem?id=3349
这道题用的hash表,开始用开放寻址法,alwayTLE,于是建了一个二维数组模拟拉链,过了,经过反复测试,用的是15000*10的。取mod的数的14997.
#include<iostream>
using namespace std;
#define prime 14997
int a[100001][6];
int hash[15000][10];
int cop[12];
int n,len;
int i,j,k,inde;
bool flag=0;
int add;
int p;
int clockwise(int k)//顺时针
{   int t;
    
if(k+5>=12)
       
return 0;
    
for(t=k;t<k+6;t++)
    {   
        
if(cop[t]!=a[hash[add][p]][t-k])
            
return 0;
    }
    
return 1;
}
int counterclockwise(int k)//逆时针
{    int t;
     
if(k-5<0)
        
return 0;
     
for(t=k;t>k-6;t--)
     {   
         
if(cop[t]!=a[hash[add][p]][k-t])
             
return 0;
     }
     
return 1;
}
int same()
{    
     
for(k=0;k<6;k++)
     {   
         cop[k]
=a[i][k];
         cop[k
+6]=a[i][k];
     }
     
for(k=0;k<12;k++)
     {    
          
if(cop[k]==a[hash[add][p]][0])
          {    
if(clockwise(k)||counterclockwise(k))
                    
return 1;
          }
     }
     
return 0;
}
int solve(int inde)
{    p
=0;
     add
=inde%prime;
     
if(!hash[add][p])
     {   hash[add][p]
=i;
         
return 0;
     }
     
else 
     {   
while(hash[add][p])
         {   
             
if(same())
             {  
                   flag
=1;
                   
return 0;
             }
             p
++;
         }
         hash[add][p]
=i;
     }
     
return 0;
}

int main()
{   memset(hash,
0,sizeof(hash));
    scanf(
"%d",&n);
    
for(i=1;i<=n;i++)
    {    inde
=0;
         
for(j=0;j<6;j++)
         {    
              scanf(
"%d",&a[i][j]);
              inde
+=a[i][j];
         }
         solve(inde);
         
if(flag)
         {   printf(
"Twin snowflakes found.\n");
             system(
"pause");
             
return 0;
         }
         
    }
    
if(!flag)
       printf(
"No two snowflakes are alike.\n");
    system(
"pause");
    
return 0;
}