poj3274

来源:互联网 发布:byte数组转string乱码 编辑:程序博客网 时间:2024/05/01 07:04

题意:


  解法:bit[i][j]记录着前i个数中,j位有多少个,然后通过以下几行乱搞了一个hash:

          for(int j=0;j<k;j++)            mi=min(mi,bit[i][j]);          for(int j=0;j<k;j++)           tool+=(long long)(1<<(j%15))*(bit[i][j]-mi);           tool%=inf;
      然后去找i前面tool值一样的再一位一位比较;
代码:
#include <iostream>#include <vector>#include <stdio.h>#include <cstring>#define inf 999983using namespace std;int n,k;int num[100010];long long bit[100010][32];vector<vector<int> > vec;bool judge(int i,int j){    int tool=-1;    for(int p=0;p<k;p++)    {        if(tool==-1||bit[i][p]-bit[j][p]==tool)            tool=bit[i][p]-bit[j][p];        else        {            return false;        }    }    return true;}int main(){   while(scanf("%d%d",&n,&k)==2)   {       vec.clear();       memset(num,0,sizeof num);       memset(bit,0,sizeof bit);        vec.resize(1000000);    for(int i=0;i<n;i++)    {        scanf("%d",num+i);    }    for(int i=1;i<=n;i++)    {        for(int j=0;j<k;j++)        {            bit[i][j]=bit[i-1][j];            if(num[i-1]&(1<<j))                bit[i][j]++;        }    }      int ans=0;      for(int i=0;i<=n;i++)      {          long long mi=1000000000;          long long tool=0;          for(int j=0;j<k;j++)            mi=min(mi,bit[i][j]);          for(int j=0;j<k;j++)           tool+=(long long)(1<<(j%15))*(bit[i][j]-mi);           tool%=inf;        for(int j=0;j<vec[tool].size();j++)        {            if(judge(i,vec[tool][j]))               ans=max(ans,i-vec[tool][j]);//,cout<<i<<" "<<vec[tool][j]<<endl;        }          //cout<<ans<<endl;        vec[tool].push_back(i);      }      printf("%d\n",ans);   }    return 0;}


0 0