Gold Balanced Lineup
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include <cstdlib> 5 #define MAXN 100001 6 using namespace std; 7 8 const int mod=99991; 9 int sum[MAXN][30]; 10 int f[MAXN][30]; 11 int c[MAXN][30]; 12 int n,k,len; 13 struct node 14 { 15 int xx; 16 node *next; 17 }; 18 node *hash[mod]; 19 20 bool cmp(int a,int b) 21 { 22 for(int j=0; j<k; j++) 23 if(c[a][j]!=c[b][j]) 24 return false; 25 return true; 26 } 27 28 void insert(int x) 29 { 30 int key=0; 31 for(int j=1; j<k; j++) 32 { 33 key+=c[x][j]*j; 34 } 35 key=abs(key)%mod; 36 if(!hash[key]) 37 { 38 node *p1=new node(); 39 p1->xx=x; 40 hash[key]=p1; 41 } 42 else 43 { 44 node *p=hash[key]; 45 if(cmp(p->xx,x)) 46 { 47 int d=x-(p->xx); 48 if(len<d) 49 len=d; 50 return; 51 } 52 else 53 { 54 while(p->next) 55 { 56 if(cmp(p->next->xx,x)) 57 { 58 int dd=x-(p->next->xx); 59 if(dd>len) 60 len=dd; 61 return; 62 } 63 p=p->next; 64 } 65 node *pp=new node(); 66 pp->xx=x; 67 p->next=pp; 68 } 69 } 70 return ; 71 } 72 73 void inti() 74 { 75 for(int i=0; i<k; i++) 76 { 77 c[0][i]=0; 78 sum[0][i]=0; 79 } 80 for(int i=0; i<mod; i++) 81 hash[i]=NULL; 82 } 83 84 int main() 85 { 86 while(scanf("%d%d",&n,&k)!=EOF) 87 { 88 inti(); 89 insert(0); 90 len=0; 91 int m; 92 for(int i=1; i<=n; i++) 93 { 94 scanf("%d",&m); 95 for(int j=0; j<k; j++) 96 { 97 f[i][j]=m%2; 98 m/=2; 99 sum[i][j]=sum[i-1][j]+f[i][j]; 100 c[i][j]=sum[i][j]-sum[i][0]; 101 } 102 insert(i); 103 } 104 printf("%d\n",len); 105 } 106 return 0; 107 }