题意:
解法:bit[i][j]记录着前i个数中,j位有多少个,然后通过以下几行乱搞了一个hash:
for(int j=0;j<k;j++)
mi=min(mi,bit[i][j]);
for(int j=0;j<k;j++)
tool+=(long long)(1<<(j%15))*(bit[i][j]-mi);
tool%=inf;
然后去找i前面tool值一样的再一位一位比较;
代码:
#include <iostream> #include <vector> #include <stdio.h> #include <cstring> #define inf 999983 using namespace std; int n,k; int num[100010]; long long bit[100010][32]; vector<vector<int> > vec; bool judge(int i,int j) { int tool=-1; for(int p=0;p<k;p++) { if(tool==-1||bit[i][p]-bit[j][p]==tool) tool=bit[i][p]-bit[j][p]; else { return false; } } return true; } int main() { while(scanf("%d%d",&n,&k)==2) { vec.clear(); memset(num,0,sizeof num); memset(bit,0,sizeof bit); vec.resize(1000000); for(int i=0;i<n;i++) { scanf("%d",num+i); } for(int i=1;i<=n;i++) { for(int j=0;j<k;j++) { bit[i][j]=bit[i-1][j]; if(num[i-1]&(1<<j)) bit[i][j]++; } } int ans=0; for(int i=0;i<=n;i++) { long long mi=1000000000; long long tool=0; for(int j=0;j<k;j++) mi=min(mi,bit[i][j]); for(int j=0;j<k;j++) tool+=(long long)(1<<(j%15))*(bit[i][j]-mi); tool%=inf; for(int j=0;j<vec[tool].size();j++) { if(judge(i,vec[tool][j])) ans=max(ans,i-vec[tool][j]);//,cout<<i<<" "<<vec[tool][j]<<endl; } //cout<<ans<<endl; vec[tool].push_back(i); } printf("%d\n",ans); } return 0; }