Compute's Knapsack
题号:NC221060
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 1024 M,其他语言2048 M
64bit IO Format: %lld

题目描述

有一次 Compute 打比赛的时候拿到了一个超大背包,而这个背包不止大这么简单,它可以把装的物品的体积暂时改变,这就使得他可以装更多的东西。

具体的,Compute获得的背包最大容积为 m 。如果背包里面装了 k 件物品,而这 k 件物品的体积分别为 ,则这 k 件物品的总体积 W 就变成了 。其中 表示按位异或运算。

Compute 很开心地带着这个背包去购物,店内有 n 件不同的商品,商品 i 的体积为 w_i,而购买 i 能带给他 a_i 的满足度。

Compute 现在想要知道自己本次购物所能获得的满足度的和最大为多少。

输入描述:

第一行两个整数 n,m ,分别表示店内商品的个数和背包的容积。

第二行有 n 个整数 ,分别表示 n 件物品的体积。

第三行有 n 个整数 ,分别表示 n 件物品能带给 Compute 的满足度。

输出描述:

在一行输出一个整数,表示 Compute 能获得的满足度和的最大值。
示例1

输入

复制
4 3
1 3 4 5
2 5 -3 100

输出

复制
104
示例2

输入

复制
1 1000000000
1
-1000000000

输出

复制
0
示例3

输入

复制
4 8
1 2 4 8
13 6 32 50

输出

复制
51

备注:

按位异或(bitwise or)是一种二进制位运算方法,其真值表如下: 






两个整数的异或值为它们二进制下按位异或的结果。

如 3 的二进制表示为 (0011)_2 , 9 的二进制表示为 (1001)_2 , 10 的二进制表示为 (1010)_2 。则

根据定义我们知道,异或运算满足交换律和结合律。