热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GoldBalancedLineuphash函数,第一次接触,借鉴了大神的博客思想,看了很久才看懂,弱菜啦

ProblemDescriptionFarmerJohnsNcows(1≤N≤100,000)sharemanysimilarities.Infact,
Problem Description

Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been able to narrow down the list of features shared by his cows to a list of onlyK different features (1 ≤ K ≤ 30). For example, cows exhibiting feature #1 might have spots, cows exhibiting feature #2 might prefer C to Pascal, and so on.

FJ has even devised a concise way to describe each cow in terms of its "feature ID", a single K-bit integer whose binary representation tells us the set of features exhibited by the cow. As an example, suppose a cow has feature ID = 13. Since 13 written in binary is 1101, this means our cow exhibits features 1, 3, and 4 (reading right to left), but not feature 2. More generally, we find a 1 in the 2^(i-1) place if a cow exhibits feature i.

Always the sensitive fellow, FJ lined up cows 1..N in a long row and noticed that certain ranges of cows are somewhat "balanced" in terms of the features the exhibit. A contiguous range of cows i..j is balanced if each of the K possible features is exhibited by the same number of cows in the range. FJ is curious as to the size of the largest balanced range of cows. See if you can determine it.

 

 

Input
Line 1: Two space-separated integers,  N and  K
Lines 2.. N+1: Line  i+1 contains a single  K-bit integer specifying the features present in cow  i. The least-significant bit of this integer is 1 if the cow exhibits feature #1, and the most-significant bit is 1 if the cow exhibits feature # K.
 

 

Output
Line 1: A single integer giving the size of the largest contiguous balanced group of cows.
 

 

Sample Input
7 3 7 6 7 2 1 4 2
 

 

Sample Output
4
****************************************************************************************************************************
  1 /*
  2 数组sum[i][j]表示从第1到第i头cow属性j的出现次数。
  3 
  4 所以题目要求等价为:
  5 
  6 求满足
  7 
  8 sum[i][0]-sum[j][0]=sum[i][1]-sum[j][1]=.....=sum[i][k-1]-sum[j][k-1] (j  9 
 10 中最大的i-j
 11 
 12  
 13 
 14 将上式变换可得到
 15 
 16 sum[i][1]-sum[i][0] = sum[j][1]-sum[j][0]
 17 
 18 sum[i][2]-sum[i][0] = sum[j][2]-sum[j][0]
 19 
 20 ......
 21 
 22 sum[i][k-1]-sum[i][0] = sum[j][k-1]-sum[j][0]
 23 
 24  
 25 
 26 令C[i][y]=sum[i][y]-sum[i][0] (0 27 
 28 初始条件C[0][0~k-1]=0
 29 
 30  
 31 
 32 所以只需求满足C[i][]==C[j][] 中最大的i-j,其中0<=j 33 
 34 C[i][]==C[j][] 即二维数组C[][]第i行与第j行对应列的值相等,
 35 
 36 那么原题就转化为求C数组中 相等且相隔最远的两行的距离i-j。
 37 */
 38 #include
 39 #include<string>
 40 #include
 41 #include
 42 #include
 43 using namespace std;
 44 const int maxn=107777;
 45 int hash[maxn],c[maxn][50],sum[maxn];
 46 int i,j,k,n,m;
 47 //min_index[]数组代表相等的上一行的下标
 48 int min_index[maxn],next[maxn];
 49 bool  judge(int a,int b)//判断a行和b行是否相等
 50 {
 51     for(int it=0;it)
 52     {
 53         if(c[a][it]!=c[b][it])
 54           return false;
 55     }
 56     return true;
 57 }
 58 int hashcode(int *v)//hash函数
 59 {
 60    int s=0;
 61    for(int it=0;it)
 62    {
 63        s=((s<<2)+(v[it]>>4))^(v[it]<<10);
 64    }
 65    s=s%maxn;
 66    if(s<0)
 67     s=s+maxn;
 68    return s;
 69 }
 70 int all_0(int index)//判断一行是否为0
 71 {
 72    for(int it=0;it)
 73    {
 74        if(c[index][i]!=0)
 75          return false;
 76    }
 77    return true;
 78 }
 79 void insert(int index)
 80 {
 81     int h=hashcode(c[index]);
 82     if(!h)
 83     {
 84         if(all_0(index))
 85         {
 86             min_index[index]=0;
 87             return;
 88         }
 89     }
 90     int u=hash[h];
 91     if(!u)//如果hash数组为0,则赋值
 92     {
 93         min_index[index]=index;
 94         hash[h]=index;
 95         return;
 96     }
 97     while(u)
 98     {
 99         if(judge(index,u))//找到相等的,则返回
100         {
101             min_index[index]=min_index[u];
102             return;
103         }
104         u=next[u];
105     }
106     min_index[index]=index;
107     next[index]=hash[h];
108     hash[h]=index;
109 
110 }
111 int main()
112 {
113     while(~scanf("%d%d",&n,&k))
114     {
115         memset(c,0,sizeof(c));
116         memset(min_index,0,sizeof(min_index));
117         memset(next,0,sizeof(next));
118         memset(hash,0,sizeof(hash));
119         int sum[39]={0},num,max1=0;
120         for(i=1;i<=n;i++)
121         {
122             scanf("%d",&num);
123             for(j=0;j)
124             {
125                 sum[j]+=((1<1:0;
126                 c[i][j]=sum[j]-sum[0];
127             }
128             insert(i);
129         }
130         for(i=1;i<=n;i++)//求最大值
131         {
132             if(max1min_index[i])
133              max1=i-min_index[i];
134         }
135         printf("%d\n",max1);
136     }
137     return 0;
138 }
View Code

 


推荐阅读
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 本文探讨了一种高效的算法,用于生成所有数字(0-9)的六位组合,允许重复使用数字,并确保这些组合的和等于给定的整数N。该算法通过优化搜索策略,显著提高了计算效率,适用于大规模数据处理和组合优化问题。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 本文详细探讨了Oracle数据库中Number和Float数据类型的特性和使用方法。通过对比分析,解释了Number类型在精度和范围上的优势,以及Float类型在处理科学计算时的灵活性。文章还介绍了Number数据类型的语法结构及其在实际应用中的最佳实践,帮助读者更好地理解和选择合适的数据类型以满足不同的业务需求。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 本文探讨了如何在C#应用程序中通过选择ComboBox项从MySQL数据库中检索数据值。具体介绍了在事件处理方法 `comboBox2_SelectedIndexChanged` 中可能出现的常见错误,并提供了详细的解决方案和优化建议,以确保数据能够正确且高效地从数据库中读取并显示在界面上。此外,还讨论了连接字符串的配置、SQL查询语句的编写以及异常处理的最佳实践,帮助开发者避免常见的陷阱并提高代码的健壮性。 ... [详细]
  • Python进阶笔记:深入理解装饰器、生成器与迭代器的应用
    本文深入探讨了Python中的装饰器、生成器和迭代器的应用。装饰器本质上是一个函数,用于在不修改原函数代码和调用方式的前提下为其添加额外功能。实现装饰器需要掌握闭包、高阶函数等基础知识。生成器通过 `yield` 语句提供了一种高效生成和处理大量数据的方法,而迭代器则是一种可以逐个访问集合中元素的对象。文章详细解析了这些概念的原理和实际应用案例,帮助读者更好地理解和使用这些高级特性。 ... [详细]
author-avatar
rockminer
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有