C++-POJ3274-Gold Balanced Lineup[hash]
阅读原文时间:2023年07月10日阅读:1

不是很懂?

胡乱hash

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=;
int n,k;
struct node{int p,next,a[];}cow[maxn];
int hashHead[maxn],cnt;

bool cmp(int a,int b){
for(int i=;i<=k;i++)if(cow[a].a[i]!=cow[b].a[i])return false;
return true;
}

int GetHash(int a){
int ans=;
for(int i=; i<=k; i++)ans=(ans*+cow[a].a[i])%maxn; return ans>?ans:-ans;
}

int main() {
scanf("%d%d",&n,&k);
for(int i=; i<=n; i++){
int x;
scanf("%d",&x);
for(int j=; j<=k; j++,x/=)cow[i].a[j]=x%;
}
for(int i=; i<=n; i++)for(int j=; j<=k; j++)cow[i].a[j]+=cow[i-].a[j];
for(int i=; i<=n; i++)for(int j=; j<=k; j++)cow[i].a[j]-=cow[i].a[k];
int ans=;
for(int i=; i<=n; i++){
int hash=GetHash(i),p=;
for(int j=hashHead[hash];j;j=cow[j].next)if(cmp(i,cow[j].p))p=cow[j].p;
if(p)ans=max(ans,i-p);
if(hash==)ans=max(i,ans);//???
cow[++cnt].p=i;
cow[cnt].next=hashHead[hash];
hashHead[hash]=cnt;
}
printf("%d\n",ans);
return ;
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章