poj3274

来源:互联网 发布:ps如何制作淘宝详情页 编辑:程序博客网 时间:2024/05/01 16:27
#include <iostream>#include <set>#include <map>#include <queue>#include <math.h>#include <vector>#include <string>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;const int size=100001;const int mod=99991;int feature[size][30];int sum[size][30];int c[size][30];int N,K,MaxLen;typedef class HASH{public:    int pi;    class HASH* next;    HASH()    {        next=0;    }}HashTable;HashTable* hash[mod];bool cmp(int a,int b){    int i;    for(i=0;i<K;i++)        if(c[a][i]!=c[b][i])           return false;    return true;}void Hash(int ci){    int i,j,key=0;    for(i=1;i<K;i++)        key+=c[ci][i]*i;    key=abs(key)%mod;    if(!hash[key])    {        HashTable* pn=new HashTable;        pn->pi=ci;        hash[key]=pn;        return ;    }    HashTable* pn=new HashTable;    pn=hash[key];    if(cmp(pn->pi,ci))    {        int ans=ci-(pn->pi);        MaxLen=MaxLen>ans? MaxLen:ans;        return ;    }    while(pn->next)    {        if(cmp((pn->next->pi),ci))        {            int ans=ci-(pn->next->pi);            MaxLen=MaxLen>ans? MaxLen:ans;            return ;        }        pn=pn->next;    }    HashTable* temp=new HashTable;    temp->pi=ci;    pn->next=temp;    return ;}int main(){    int i,j;    while(cin>>N>>K)    {        for(i=0;i<K;i++)            sum[0][i]=c[0][i]=0;        memset(hash,0,sizeof(hash));        MaxLen=0;        Hash(0);        for(i=1;i<=N;i++)        {            int temp,g;            cin>>temp;            for(j=0;j<K;j++)            {                feature[i][j]=temp%2;                temp/=2;                sum[i][j]=sum[i-1][j]+feature[i][j];                c[i][j]=sum[i][j]-sum[i][0];            }            Hash(i);        }        cout<<MaxLen<<endl;    }    return 0;}

0 0