
n个牛 二进制最多k位
给你n个数
求max(j-i)&&对应二进制位的和相同
7 1 1 1 倒的
6 0 1 1
7 1 1 1
2 0 1 0
1 1 0 0
4 0 0 1
2 0 1 0
3 4 5 6 加起来一样
前缀和 - 第一列
然后就发现对应相等就是和相同
根据 和 hash
和 有小于0的
下标注意一下
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector> using namespace std; #define MAXN 100010
#define mod 14997 int n,k;
int x[MAXN][];
vector<int>hash[]; int main()
{
scanf("%d%d",&n,&k);
int ans=; for(int i=;i<=n;i++)
{
int a,j,ii;
scanf("%d",&a);
j=;
while(a)
{
x[i][j++]=a%;
a=a/;
}
for(ii=;ii<=k;ii++)
x[i][ii]+=x[i-][ii];
for(ii=;ii<k;ii++)
if(x[i][ii]!=x[i][ii+])
break;
if(ii==k)
ans=i;
} for(int i=;i<=n;i++)
{
int sum=,ii;
for(int j=;j<=k;j++)
{
x[i][j]-=x[i][];
sum=sum+x[i][j];
}
x[i][]=;
sum=abs(sum)%mod;
for(int j=;j<hash[sum].size();j++)
{
for(ii=;ii<=k;ii++)
if(x[hash[sum][j]][ii]!=x[i][ii])
break;
if(ii==k+&&i-hash[sum][j]>ans)
ans=i-hash[sum][j];
}
hash[sum].push_back(i);
}
printf("%d\n",ans);
return ;
}