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

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1005;
    const int base=10007;
    typedef unsigned long long ULL;
    set<ULL>save;
    int n;
    int a[4][maxn],b[maxn];
    int id[maxn<<1];
    int ave;
    ULL B[maxn];
    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 legal(int x){
        return x>=2&&x<=ave-2;
    }
    bool ok(int d){
        for(int j=0;j<n;j++){
            b[j]=ave-a[2][j]-a[3][id[j+d]];
            if(!legal(b[j]))return 0;
        }
        return save.find(gethash(b,n))!=save.end();
    }
    int main(){
    //    freopen("in","r",stdin);
        B[0]=1;
        for(int i=1;i<maxn;i++)B[i]=B[i-1]*base;
        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;
    }
  • 相关阅读:
    vue day6 分页显示
    vue day5 分页控件
    vue day4 table
    c# excel xlsx 保存
    diff算法
    Web Workers
    多线程
    Http请求优化
    高效编写代码
    渲染引擎
  • 原文地址:https://www.cnblogs.com/wshh/p/4495408.html
Copyright © 2011-2022 走看看