P3274
hash.同余.不过这里的同余不是普通意义上的同余.
#include
<
iostream
>
#include
<
fstream
>
using
namespace
std;
//
ifstream fin("1.txt");
const
int
MAXN
=
100001
;
const
int
mod
=
99991
;
int
n,k;
int
c[MAXN][
30
];
int
d[MAXN][
30
];
int
h[mod];
int
p[MAXN],len
=
0
;
int
s[MAXN];
int
result
=
0
;
inline
int
hashcode(
const
int
id)

{
int s = 0;
for(int i=0; i<k; i++)
s=((s<<2)+(d[id][i]>>4))^(d[id][i]<<10);
s = s % mod;
s = s < 0 ? s + mod : s;
return s;
}


void
find_hash(
int
x,
int
id)

{
int f[30];
bool ok=true;
for (int i=0;i<k;i++)

{
if (i==0) f[i]=c[id][i]-c[p[x]][i];
else

{
f[i]=c[id][i]-c[p[x]][i];

if (f[i]!=f[i-1]||f[i]==0)
{ok=false;break;}
}
}
if (ok)

{
if (result<id-p[x])

{
result=id-p[x];
}
}
if (s[x]==-1)

{
len++;
s[x]=len;
s[len]=-1;
p[len]=id;
return;
}
else

{
find_hash(s[x],id);
}
}
void
hash(
int
u,
int
id)

{
if (h[u]==-1)

{
len++;
h[u]=len;
s[len]=-1;
p[len]=id;
return;
}
find_hash(h[u],id);
}
int
main()

{
cin>>n>>k;

if (n==1)
{cout<<1<<endl;exit(0);}
memset(h,-1,sizeof(h));
memset(c,0,sizeof(c));
for (int i=1;i<=n;i++)

{
int x;
cin>>x;
int l=-1;
for (int j=0;j<k;j++)

{
int p=x%2;
l++;
c[i][l]=c[i-1][l]+p;
x/=2;
}
}
memcpy(d,c,sizeof(c));
for (int i=0;i<=n;i++)

{
int max=MAXN;
for (int j=0;j<k;j++)

{
if (max>d[i][j]) max=d[i][j];
}
for (int j=0;j<k;j++)

{
d[i][j]-=max;
}
int u=hashcode(i);
//cout<<u<<endl;
hash(u,i);
}
cout<<result<<endl;
// system("pause");
return 0;
}