题目:http://poj.org/problem?id=3274
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<queue>
#include<iomanip>
#include<cmath>
#include<map>
#include<vector>
#include<algorithm>
using namespace std; #define prime 100003
int n,k,f;
int bit[prime][],head[prime],next[prime];
int hash(int v[])//据说 这叫折叠法,我还是不明白什么意思
{
int i,h=;
for(i=; i<k; i++)
h=((h<<)+(v[i]>>))^(v[i]<<);
h=h%prime;
h=h<?h+prime:h;
return h;
}
int main()
{
int ans=,i,j,temp,h,flag;
cin>>n>>k;
memset(bit,,sizeof(bit));
memset(head,-,sizeof(head));
for(i=; i<=n; i++)
{
cin>>f;
for(j=; j<k; j++)
{
bit[i][j]=f&;
f=f>>;
}
}
for(i=; i<=n; i++)
for(j=; j<k; j++)
bit[i][j]+=bit[i-][j];
for(i=; i<=n; i++)
{
temp=bit[i][];
for(j=; j<k; j++)
bit[i][j]-=temp;
h=hash(bit[i]);
flag=;
for(int e=head[h]; e!=-; e=next[e]) //拉链法处理冲突
{
if(memcmp(bit[e],bit[i],sizeof(bit[i]))==)
{
ans=max(ans,i-e);
flag=;
break;
}
}
if(!flag)
{
next[i]=head[h];
head[h]=i;
}
}
cout<<ans<<endl;
return ;
}