巢穴

about:blank

P3274

hash.同余.不过这里的同余不是普通意义上的同余.

#include <iostream>
#include 
<fstream>
using namespace std;
//ifstream fin("1.txt");
const int MAXN=100001;
const int mod=99991;
int n,k;
int c[MAXN][30];
int d[MAXN][30];
int h[mod];
int p[MAXN],len=0;
int s[MAXN];
int result=0;
inline 
int hashcode(const int id)
 
{
    
int s = 0;
    
for(int i=0; i<k; i++)
        s
=((s<<2)+(d[id][i]>>4))^(d[id][i]<<10);
     s 
= s % mod;
    s 
= s < 0 ? s + mod : s;
    
return s;
 }



void find_hash(int x,int id)
{
  
int f[30];
  
bool ok=true;
  
for (int i=0;i<k;i++)
  
{
   
if (i==0) f[i]=c[id][i]-c[p[x]][i];
   
else
   
{
    f[i]
=c[id][i]-c[p[x]][i];
    
if (f[i]!=f[i-1]||f[i]==0{ok=false;break;}
   }

  }

  
if (ok)
  
{
   
if (result<id-p[x]) 
   
{
   result
=id-p[x];
   }

  }

  
if (s[x]==-1)
  
{
   len
++;
   s[x]
=len;
   s[len]
=-1;
   p[len]
=id;
   
return;
  }

  
else
  
{
   find_hash(s[x],id);
  }

}

void hash(int u,int id)
{
     
if (h[u]==-1)
     
{
      len
++;
      h[u]
=len;
      s[len]
=-1;
      p[len]
=id;
      
return;
     }

     find_hash(h[u],id);
}

int main()
{
    cin
>>n>>k;
   
if (n==1{cout<<1<<endl;exit(0);}
    memset(h,
-1,sizeof(h));
    memset(c,
0,sizeof(c));
    
for (int i=1;i<=n;i++)
    
{
     
int x;
     cin
>>x;
     
int l=-1;
     
for (int j=0;j<k;j++)
     
{
      
int p=x%2;
      l
++;
      c[i][l]
=c[i-1][l]+p;
      x
/=2;
     }

    }

    
    memcpy(d,c,
sizeof(c));
    
for (int i=0;i<=n;i++)
    
{
     
int max=MAXN;
     
for (int j=0;j<k;j++)
     
{
         
if (max>d[i][j]) max=d[i][j];
     }

     
for (int j=0;j<k;j++)
     
{
         d[i][j]
-=max;
     }

     
int u=hashcode(i);
     
//cout<<u<<endl;
     hash(u,i);
    }

    
    
    cout
<<result<<endl;
  
//  system("pause");
    return 0;
}

posted on 2009-10-21 12:46 Vincent 阅读(154) 评论(0)  编辑 收藏 引用 所属分类: 数据结构与算法


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理