poj3274

来源:互联网 发布:差旅费报销软件 编辑:程序博客网 时间:2024/05/01 11:48
  1. #include<iostream>  
  2. #include<cmath>  
  3. using namespace std;  
  4.   
  5. const int size=100001;  
  6. const int mod=99991;  
  7.   
  8. int feature[size][30];  //feature[i][j]标记第i只牛是否有特征j  
  9. int sum[size][30];  //从第1到第i只牛,特征j总共出现了sum[i][j]次  
  10. int c[size][30];  //c[i][j]=sum[i][j]-sum[i][0] , 即所有列都减去第一列后,值保存在c[][]  
  11. int N;  //牛数量  
  12. int K;  //特征数  
  13. int MaxLen;  //最大距离  
  14.   
  15. typedef class HASH  
  16. {  
  17.     public:  
  18.         int pi;  //保存c[i][j]的行地址c[i]的下标i  
  19.         class HASH* next;  
  20.         HASH()  
  21.         {  
  22.             next=0;  
  23.         }  
  24. }HashTable;  
  25.   
  26. HashTable* hash[mod];  
  27.   
  28. /*检查c[ai][]与c[bi][]是否对应列相等*/  
  29. bool cmp(int ai,int bi)  
  30. {  
  31.     for(int j=0;j<K;j++)  
  32.         if(c[ai][j]!=c[bi][j])  
  33.             return false;  
  34.     return true;  
  35. }  
  36.   
  37. void Hash(int ci)  
  38. {  
  39.     int key=0;   //生成关键字  
  40.     for(int j=1;j<K;j++)  
  41.         key+=c[ci][j]*j;  
  42.     key=abs(key)%mod;  //由于c[][]有正有负,因此key值可能为负数  
  43.   
  44.     if(!hash[key])  //新key  
  45.     {  
  46.         HashTable* pn=new HashTable;  
  47.   
  48.         pn->pi=ci;  
  49.         hash[key]=pn;  
  50.     }  
  51.     else  //key值冲突  
  52.     {  
  53.         HashTable* pn=hash[key];  
  54.   
  55.         if(cmp(pn->pi,ci))  
  56.         {  
  57.             int dist=ci-(pn->pi);  
  58.             if(MaxLen<dist)  
  59.                 MaxLen=dist;  
  60.             return;  //由于pi与ci对应列数字相等,且pi地址必定比ci小  
  61.         }            //而要求的是最大距离,因此不需要保存ci,判断距离后直接返回  
  62.         else  
  63.         {  
  64.             while(pn->next)  
  65.             {  
  66.                 if(cmp(pn->next->pi,ci))  
  67.                 {  
  68.                     int dist=ci-(pn->next->pi);  
  69.                     if(MaxLen<dist)  
  70.                         MaxLen=dist;  
  71.                     return;  
  72.                 }  
  73.                 pn=pn->next;  
  74.             }  
  75.   
  76.             //地址冲突但c[][]各列的值不完全相同  
  77.   
  78.             HashTable* temp=new HashTable;  
  79.             temp->pi=ci;  
  80.             pn->next=temp;  
  81.         }  
  82.     }  
  83.     return;  
  84. }  
  85.   
  86. int main(void)  
  87. {  
  88.     freopen("in.txt","r",stdin);  
  89.     while(cin>>N>>K)  
  90.     {  
  91.         /*Initial*/  
  92.           
  93.         for(int p=0;p<K;p++)  
  94.         {  
  95.             c[0][p]=0; //第0只牛的特征默认为全0  
  96.             sum[0][p]=0;  
  97.         }  
  98.   
  99.         memset(hash,0,sizeof(hash));  
  100.         Hash(0);  //把第0只牛先放入哈希表  
  101.         MaxLen=0;  
  102.   
  103.         /*Input*/  
  104.   
  105.         for(int i=1;i<=N;i++)  
  106.         {  
  107.             int Dexf;   //十进制特征数  
  108.             cin>>Dexf;  
  109.   
  110.             for(int j=0;j<K;j++)  
  111.             {  
  112.                 feature[i][j]=Dexf%2;  //Dexf转换为逆序二进制  
  113.                 Dexf/=2;  
  114.   
  115.                 sum[i][j]=sum[i-1][j]+feature[i][j];  
  116.                 c[i][j]=sum[i][j]-sum[i][0];  
  117.             }  
  118.   
  119.             Hash(i);  
  120.         }  
  121.   
  122.         /*Output*/  
  123.   
  124.         cout<<MaxLen<<endl;  
  125.     }  
  126.     return 0;  
0 0
原创粉丝点击