目录:
题目:
分析:
我们可以用 判断两片雪花是否相同,然后用每片雪花的最小表示法,这样就不需要别的判断。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<set>
#include<map>
#include<list>
#include<ctime>
#include<iomanip>
#include<string>
#include<bitset>
#define LL long long
#define seed 13131
#define king 160001
#define ull unsigned long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
int min(int x,int y)
{
return x<y? x:y;
}
int max(int x,int y)
{
return x>y? x:y;
}
ull h[king];
int find(ull x)
{
int pos=x%king,i=0;
while(i<king&&h[(pos+i)%king]&&h[(pos+i)%king]!=x)
i++;
return (pos+i)%king;
}
int x[20];
bool ha(int x1,int y)
{
int tf=0,ans=x1,k,pos;
ull sum=0;
for(k=0;k<6&&x[x1+k]==x[y-k];k++);
if(x[x1+k]>x[y-k]) ans=y,tf=1;
if(tf==1) for(ull i=ans;i>ans-6;i--) sum=sum*seed+x[i];
else for(ull i=ans;i<ans+6;i++) sum=sum*seed+x[i];
pos=find(sum);
if(h[pos]==sum) return 1;
else {h[pos]=sum;return 0;}
}
int main()
{
int n=read();
while(n--)
{
for(int i=7;i<=12;i++) x[i]=read();
for(int i=1;i<=6;i++) x[i]=x[i+12]=x[i+6];
int k,i=7,j=8,ans1,ans2;
while(i<=12&&j<=12)
{
for(k=0;k<=6&&x[i+k]==x[j+k];k++);
if(k==6) break;
if(x[i+k]>x[j+k])
{
i+=k+1;
i+=(i==j);
}
else
{
j+=k+1;
j+=(i==j);
}
}
ans1=min(i,j);
i=12;j=11;
while(i>6&&j>6)
{
for(k=0;k<=6&&x[i-k]==x[j-k];k++);
if(k==6) break;
if(x[i-k]>x[j-k])
{
i-=(k+1);
i-=(i==j);
}
else
{
j-=(k+1);
j-=(i==j);
}
}
ans2=max(i,j);
if(ha(ans1,ans2)) {printf("Twin snowflakes found.");return 0;}
}
printf("No two snowflakes are alike.");
return 0;
}