Gold Balanced Lineup_编程Gold Balanced Lineup_i++_02
  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 }
View Code