黄金阵容均衡[luogu1360] [usaco2007]
题意:有个人有m种能力,然后有n天,每天会提升m种能力中的几种,如果第n天提升能力是6,换成二进制就是00110,那么从右到左为一的位置就是那天提升了一次能力,6的话就是提升了第二、三种能力,我们把[l,r]这个区间内m种能力提升的次数相同的区间叫做均衡区间。求最大均衡区间。说到底就是给你一串数,这串数化成二进制之后,每个二进制数位的1的个数要相等。
example:
第一天:7 00111
第二天:6 00110
第三天:7 00111
第四天:2 00010
第五天:1 00001
第六天:4 00100
第七天:2 00010
这串数的最大均衡区间是第3天到第6天,这4天的和是00222;
这个题主要就是判断区间[l,r]是否合法;
首先位运算每一位的前缀和,然后判断是否合法;
假设[1,L]的区间为a1-a29,[1,r]的区间为b1-b29;
区间合法就是b1-a1=b2-a2…b29-a29;
移项之后就是
b1-b2=a1-a2
…
b28-b29=a28-a29可以用一个数组存这个式子
arr[i]={a1-a2,…,a28-a29};
这个问题就转换成了对于数组arr[i],间距最远的两个相等的arr[i],arr[j]的距离了。
排序可解决:nlogn30
hash可解决:nlogn+n30
贴个hash方法(针对字符串,别的类推就可以了)
1 | //字符串hash |
AC hash 代码
1 |
|