题目背景
试题来源:https://koi.or.kr/archives/。中文翻译做了少量本土化修改。
按照署名—非商业性使用—相同方式共享 4.0 协议国际版进行授权。
题目描述
在一个字符串中,选择一个或多个连续位置的字符,并保持其顺序排列后得到的字符串,称为该字符串的子字符串。
例如,001 是字符串 X=10011 的子字符串,但不是字符串 Y=10101 的子字符串。
两个非负整数 A 和 B 的异或(XOR)A⊕B 定义如下:
- 从二进制的角度来看,若 A 的第 2k 位与 B 的第 2k 位不同,则 A⊕B 的第 2k 位为 1;若相同,则该位为 0。(其中 k≥0)
- 例如,12⊕10 的计算如下:
12=11002,10=10102,因此
11002⊕10102=01102=6
给定一个仅由 0 和 1 组成、长度为 N 的字符串 S。
你需要计算从 S 的子字符串 s1 和 s2 中可以构造出的 g(s1,s2) 的最大值。函数 g(s1,s2) 定义如下:
- 对于 S 的子字符串 s,f(s) 表示将 s 视为二进制数后对应的十进制数值。例如,若 s=11010,则 f(s)=26。
- g(s1,s2)=f(s1)⊕f(s2)
此处 s1 和 s2 不需要不同。换句话说,s1 和 s2 可以在 S 中部分重叠,甚至可以是完全相同的字符串。
给定一个仅由 0 和 1 组成的字符串 S,请编写一个程序来计算可能的 g(s1,s2) 的最大值。
输入格式
第一行输入测试用例的个数 T。
接下来的每个测试用例包含两行:
- 第一行:字符串长度 N
- 第二行:一个长度为 N 的仅由 0 和 1 组成的字符串 S
输出格式
对于每个测试用例,输出可能的 g(s1,s2) 的最大值,用二进制表示,每行输出一个结果。
注意,结果前不应输出无意义的前导 0。
4
3
010
5
10101
5
00100
5
11111
11
11111
110
11110
4
2
00
2
01
2
10
2
11
0
1
11
10
提示
样例 1 说明
在第一个测试用例中,将 s1=010,s2=01,可以得到 g(s1,s2)=112。
尽管也可以写作 0112,但因为不能有无意义的前导 0,因此应输出 11,而不是 011。
在第四个测试用例中,将 s1=11111,s2=1,可以得到 g(s1,s2)=111102。
约束条件
- 所有给定数均为整数。
- 1≤T≤100
- 2≤N≤107
- 所有测试用例中 N 的总和 ≤107
- S 是一个由 0 和 1 组成、长度为 N 的字符串。
子问题
- (17 分)N≤30,所有测试用例中 N 的总和 ≤300
- (20 分)N≤200,所有测试用例中 N 的总和 ≤2000
- (13 分)N≤3000,所有测试用例中 N 的总和 ≤30000
- (12 分)N≤2×105,所有测试用例中 N 的总和 ≤2×106
- (38 分)无额外约束条件
翻译由 ChatGPT-4o 完成