hash函数抄网上的,自己写的死活没过:
/*数组的hash*/ |
CODE:
/*AC代码:235ms*/ #include <iostream> #include <cstdio> #include <memory.h> #include <algorithm> #define max(a,b) (a>b?a:b) #define MOD 19997 #define MAXN 100005 using namespace std; int head[20000],next[MAXN]; int N,K; int sum[MAXN][33],c[MAXN][33]; int hash(int v[])//hash函数 { int i,h=0; for(i=1;i<=K;i++) h=((h<<2)+(v[i]>>4))^(v[i]<<10); h%=MOD; h=h<0?h+MOD:h; return h; } void Init() { int i,j,temp; memset(sum,0,sizeof(sum)); for(i=1;i<=N;i++) { scanf("%d",&temp); for(j=1;j<=K;j++) { sum[i][j]=sum[i-1][j]+temp%2; temp/=2; } for(j=1;j<=K;j++) c[i][j]=sum[i][1]-sum[i][j]; } } void Solve() { int i,j,k,ans=0; memset(head,-1,sizeof(head)); for(i=0;i<=N;i++)//注意这里从0开始 { int h=hash(c[i]); //if(i==0) // printf("*%d %d\n",i,h); bool ok=false; for(j=head[h];j!=-1;j=next[j]) { for(k=1;k<=K;k++) {if(c[i][k]!=c[j][k]) break;} if(k>K)//find,因为每个都不同,所以不必再往下找了 { ans=max(ans,i-j);//注意不能加一 ok=true; break; } } if(!ok)//已经有相同的就不用再插入了 { next[i]=head[h]; head[h]=i; } } printf("%d\n",ans); } int main() { while(scanf("%d%d",&N,&K)!=EOF) { Init(); Solve(); } return 0; }