POJ3274 – Gold Balanced Lineup

///    看到网上全都是三个数组  这里用两个就够了
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<stack>
#define N 200000
#include<math.h>
#include<queue>
#define maxn  100000+5
#define mod 190401
using namespace std;
int n,k,linshi,ans;
int sum[maxn][32];
int cow[maxn][32];
vector<int>hs[mod];///   哈希
bool eq(int a,int b){///    全等为真  否则假
for(int i=0;i<k;i++){
    if(sum[a][i]!=sum[b][i])return false;
}
return true;
}
int main(){
//freopen("input2.txt","r",stdin);
memset(cow,0,sizeof(cow));
cin>>n>>k;
ans=0;
for(int i=1;i<=n;i++){///  输入
    scanf("%d",&linshi);
    for(int j=0;j<k;j++){
        cow[i][j]=linshi%2;
        linshi/=2;
    }
}
memset(sum,0,sizeof(sum));///  这里作用就是把sum[0][i]都置零  区间的长度是可以从零点开始计算的
for(int i=1;i<=n;i++){
    for(int j=0;j<k;j++){
        sum[i][j]=sum[i-1][j]+cow[i][j];
    }
}
for(int i=0;i<=n;i++){///   压缩操作并放入哈希中
        int num=0;
    for(int j=k-1;j>=0;j--){
        sum[i][j]-=sum[i][0];
        num+=sum[i][j];
    }
    if(num<0)num=-num;
    num%=mod;
    hs[num].push_back(i);
}
for(int i=0;i<mod;i++){///  找到最长长度
    for(int j=0;j<hs[i].size();j++){
        for(int k=j+1;k<hs[i].size();k++){
            if(eq(hs[i][j],hs[i][k])){
                ans=max(ans,abs(hs[i][k]-hs[i][j]));
            }
        }
    }
}
cout<<ans<<endl;
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40675883/article/details/82832569
今日推荐