码迷,mamicode.com
首页 > 其他好文 > 详细

Gym Conference Room (最小表示法,哈希)

时间:2015-05-11 21:27:47      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

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

 

Gym Conference Room (最小表示法,哈希)

标签:

原文地址:http://www.cnblogs.com/wshh/p/4495408.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!