B - Gold Balanced Lineup解题报告(张浩盛伦)
来源:互联网 发布:z-blog建站 编辑:程序博客网 时间:2024/06/05 07:43
题目链接:http://poj.org/problem?id=3274
解法类型:hash
解题思路:一道hash题啊,找key啊。当时做的时候觉得hash不好用,但它就是可以用hash优化,参考了一下别人的算法,让我对hash有了更深的领悟。首先把数转化成二进制矩阵,然后用一个数组s[i][j]来储存第j列的前i个数二进制的和,再用一个数组c[i][j]=s[i][j]-s[i][0],这样,只要某两行c[i][j]相同,那么这两行就可以算成一个contiguous balanced group。key就出来了,求和再取余或相乘再取余,随你。。~
算法实现:
//STATUS:C++_AC_969MS_27536K#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN=100010,MAX_HASH=99991;int s[MAXN][30],c[MAXN][30];int count(int a,int b);int k;struct NODE //链表写hash表{struct NODE(){next=NULL;};int num;NODE *next;}hash[MAX_HASH];int main(){//freopen("in.txt","r",stdin);int i,j,a,n,sumc,max;while(~scanf("%d%d",&n,&k)){max=0;memset(s,0,sizeof(s));memset(hash,0,sizeof(hash));NODE *p=(NODE*)malloc(sizeof(NODE));hash[0].num=0,hash[0].next=p,p->next=NULL; //这个很重要,因为要考虑第一组的情况for(i=1;i<=n;i++){ scanf("%d",&a);for(j=0,sumc=0;j<k;j++){ s[i][j]=s[i-1][j]+((a&(1<<j))?1:0); //位运算二进制c[i][j]=s[i][j]-s[i][0];sumc+=c[i][j];}int t=sumc%MAX_HASH;if(t<0)t=-t;NODE *p=&hash[t];for(;p->next!=NULL;p=p->next){ //搜索hash表int ok=count(p->num,i);if(ok!=-1 && ok>max)max=ok;}NODE *q=(NODE*)malloc(sizeof(NODE)); //搜索hash表p->num=i;p->next=q;q->next=NULL;}printf("%d\n",max);}return 0;}int count(int a,int b) //比较是否构成contiguous balanced group{int j;for(j=0;j<k;j++){if(c[a][j]!=c[b][j])return -1;}return b-a;}
- B - Gold Balanced Lineup解题报告(张浩盛伦)
- PKU 3274 Gold Balanced Lineup解题报告
- POJ-3274 Gold Balanced Lineup 解题报告
- POJ_3274 Gold Balanced Lineup 解题报告
- POJ - 3274 Gold Balanced Lineup解题报告
- 线段树:Balanced Lineup(pku 3264)(解题报告)
- POJ 3274 Gold Balanced Lineup (hash)
- POJ 3274 Gold Balanced Lineup (hash)
- POJ---3274-Gold Balanced Lineup(hash)
- PKU3274 Gold Balanced Lineup
- Gold Balanced Lineup poj3274
- POJ3274 Gold Balanced Lineup
- POJ Gold Balanced Lineup
- 哈希-Gold Balanced Lineup
- poj3274 Gold Balanced Lineup
- [POJ3274]-Gold Balanced Lineup
- Gold Balanced Lineup ( hash )
- Gold Balanced Lineup
- Form表单中post和get的区别
- 陈欧:创业是最美好的生活方式
- 打开多个Activity,返回到第一个Activity的问题
- string split函数
- Linux安装配置ICDC for DB2
- B - Gold Balanced Lineup解题报告(张浩盛伦)
- HDMI接口 简介
- windbg常用命令
- OSI7层模型每层的作用--最彻底的解释
- 我的Android笔记(十)—— ProgressDialog的简单应用,等待提示
- 2004操作系统
- C语言中的 sizeof 问题
- network: Android 网络判断(wifi、3G与其他)
- JAVA 正则表达式 (超详细)