POJ P3349 Snowflake Snow Snowflakes

目录:


题目:

传送门


分析:

我们可以用 h a s h 判断两片雪花是否相同,然后用每片雪花的最小表示法,这样就不需要别的判断。


代码:

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_35786326/article/details/81783425
今日推荐