XOR 的最大值在一个范围内?
Maximum Value of XOR in a range?
Given a matrix of size NxN. Rows and Columns are numbered from 0 to
N-1. jth column of ith row contains i xor j. In other words,
Matrix[i][j] = i ^ j where 0 ? i,j < N. Your task is to find the
maximum value occurring in this matrix and the count of its
occurrence.
虽然我的方法是
(l..r).each do |i|
(i..r).each do |j|
if (i ^ j > max)
max = i ^ j
end
end
end
我看到这段代码说根据每个人都不是二次方是在线性时间内找到它。
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long N;
long max = 1L;
long count = 1L;
long bitN ;
StringBuilder sb = new StringBuilder(4*T);
line = br.readLine();
N = Long.parseLong(line);
{
bitN = 1L << getBits(N-1);
max = (bitN - 1);
count = (bitN == N) ? bitN :(N -(bitN>>1))<<1 ;
sb.append(max);
sb.append(" ");
sb.append(count);
sb.append("\n");
}
System.out.println(sb.toString());
}
private static int getBits(long x){
int count = 0;
while(x > 0){
x = x>>1;
count++;
}
return count;
}
}
我无法理解的是这到底是怎么回事
bitN = 1L << getBits(N-1);
max = (bitN - 1);
count = (bitN == N) ? bitN :(N -(bitN>>1))<<1 ;
能够得到想要的结果。如果你们中的任何人能用简单的术语告诉我这个算法的基础,这样我就能理解这个
制作 N
与 max
和 count
的 table:
N max count how
1 0 1 0^0
2 1 2 0^1, 1^0
3 3 2 1^2, 2^1
4 3 4 1^2, 2^1, 0^3, 3^0
5 7 2 3^4, 4^3
6 7 4 3^4, 4^3, 2^5, 5^2
7 7 6 3^4, 4^3, 2^5, 5^2, 1^6, 6^1
8 7 8 3^4, 4^3, 2^5, 5^2, 1^6, 6^1, 0^7, 7^0
9 15 2 7^8, 8^7
.
.
模式是,在 N
超过 2 的幂后,max
上升,count
回到 2
。这是因为位模式如下所示:
3 = 0b011
4 = 0b100
.
.
7 = 0b0111
8 = 0b1000
bitN
是 0..N-1
中无处设置的最低位(因此 N = 8
时 bitN = 8
,N = 9
时 bitN = 16
。最大异或设置了bitN
以下的所有位,这是小学减法借位逻辑bitN - 1
。每当 N
增加 1 时,计数就会增加 2,除非 bitN
也增加,当计数重置为 2 时。三元运算符在计算 count
中的目的是针对特殊情况 N = 1
;当 N
是 2 的更大次方时,也采用左侧分支,但另一个也可以。
Given a matrix of size NxN. Rows and Columns are numbered from 0 to N-1. jth column of ith row contains i xor j. In other words, Matrix[i][j] = i ^ j where 0 ? i,j < N. Your task is to find the maximum value occurring in this matrix and the count of its occurrence.
虽然我的方法是
(l..r).each do |i|
(i..r).each do |j|
if (i ^ j > max)
max = i ^ j
end
end
end
我看到这段代码说根据每个人都不是二次方是在线性时间内找到它。
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long N;
long max = 1L;
long count = 1L;
long bitN ;
StringBuilder sb = new StringBuilder(4*T);
line = br.readLine();
N = Long.parseLong(line);
{
bitN = 1L << getBits(N-1);
max = (bitN - 1);
count = (bitN == N) ? bitN :(N -(bitN>>1))<<1 ;
sb.append(max);
sb.append(" ");
sb.append(count);
sb.append("\n");
}
System.out.println(sb.toString());
}
private static int getBits(long x){
int count = 0;
while(x > 0){
x = x>>1;
count++;
}
return count;
}
}
我无法理解的是这到底是怎么回事
bitN = 1L << getBits(N-1);
max = (bitN - 1);
count = (bitN == N) ? bitN :(N -(bitN>>1))<<1 ;
能够得到想要的结果。如果你们中的任何人能用简单的术语告诉我这个算法的基础,这样我就能理解这个
制作 N
与 max
和 count
的 table:
N max count how
1 0 1 0^0
2 1 2 0^1, 1^0
3 3 2 1^2, 2^1
4 3 4 1^2, 2^1, 0^3, 3^0
5 7 2 3^4, 4^3
6 7 4 3^4, 4^3, 2^5, 5^2
7 7 6 3^4, 4^3, 2^5, 5^2, 1^6, 6^1
8 7 8 3^4, 4^3, 2^5, 5^2, 1^6, 6^1, 0^7, 7^0
9 15 2 7^8, 8^7
.
.
模式是,在 N
超过 2 的幂后,max
上升,count
回到 2
。这是因为位模式如下所示:
3 = 0b011
4 = 0b100
.
.
7 = 0b0111
8 = 0b1000
bitN
是 0..N-1
中无处设置的最低位(因此 N = 8
时 bitN = 8
,N = 9
时 bitN = 16
。最大异或设置了bitN
以下的所有位,这是小学减法借位逻辑bitN - 1
。每当 N
增加 1 时,计数就会增加 2,除非 bitN
也增加,当计数重置为 2 时。三元运算符在计算 count
中的目的是针对特殊情况 N = 1
;当 N
是 2 的更大次方时,也采用左侧分支,但另一个也可以。