Gold Balanced Lineup

  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

 

你可能感兴趣的:(UP)