zoukankan      html  css  js  c++  java
  • Gym 100500B Conference Room(最小表示法,哈希)

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1005;
    const int base=37;
    typedef unsigned long long ULL;
    set<ULL>save;
    int n;
    int a[4][maxn],b[maxn];
    int id[maxn<<1];
    int ave;
    int MinmumRepresentation(int *s,int n){    //..............最小表示法。
        int i=0,j=1,k=0,t;
        while(i<n&&j<n&&k<n){
            t=s[(i+k)>=n?i+k-n:i+k]-s[(j+k)>=n?j+k-n:j+k];
            if(!t)k++;
            else {
                if(t>0)i=i+k+1;
                else j=j+k+1;
                if(i==j)++j;
                k=0;
            }
        }
        return(i<j?i:j);
    }
    ULL gethash(int *s,int n){
        int pos=MinmumRepresentation(s,n);
        ULL res=0;
        for(int i=0;i<n;i++)res=res*base+s[id[pos+i]];
        return res;
    }
    
    bool ok(int d){
        for(int j=0;j<n;j++){
            b[j]=ave-a[2][j]-a[3][id[j+d]];
        }
        return save.find(gethash(b,n))!=save.end();
    }
    int main(){
    //    freopen("in","r",stdin);
        int t,cas=1;
        cin>>t;
        while(t--){
            printf("Case %d: ",cas++);
            scanf("%d",&n);
            ULL sum=0;
            for(int i=0;i<4;i++)
            for(int j=0;j<n;j++){
                scanf("%d",a[i]+j);
                sum+=a[i][j];
            }
            if(sum%n){
                puts("No");
                continue;
            }
            ave=sum/n;
            save.clear();
            for(int i=0;i<2*n;i++)id[i]=i%n;
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    b[j]=a[0][j]+a[1][id[i+j]];
                }
                save.insert(gethash(b,n));
            }
            bool flag=0;
            for(int i=0;i<n;i++){
                if(ok(i)){
                    flag=1;
                    puts("Yes");
                    break;
                }
            }
            if(!flag)puts("No");
        }
        return 0;
    }
    

      

  • 相关阅读:
    java Double数据类型比较大小
    java基础02-标识符和关键字
    java基础01-注释
    java程序运行机制
    面试准备之java异常体系
    双亲委派模型
    java类加载器有哪些?
    什么是字节码?采用字节码的好处是什么?
    如何实现一个ioc容器
    ConcurrentHashMap原理,jdk7和jdk8的区别
  • 原文地址:https://www.cnblogs.com/wshh/p/4521242.html
Copyright © 2011-2022 走看看