Practice Round APAC test 2017——Problem B. Robot Rock Band

Problem

You're the manager of Xorbitant, the world's first robot rock band. There will be four positions in the band, and there are N robots auditioning for each position. (No robot is auditioning for more than one position.) Every robot has a number, and multiple robots might have the same number, just as two people can have the same name.

You know from market research that your robot audiences won't care how well the robot band members make music, how handsome they are, or what scandalous things the tabloids say about them. Instead, the audience will be checking to see whether the four members' numbers, when bitwise XORed together, equal a certain trendy number K.

How many different sets of four robots (one for each position) is it possible to choose so that the band will have this property? More specifically, given four lists A, B, C, D containing N numbers each, how many ways are there to choose one number a from list A, one number b from list B, and so on, such that a^b^c^d = K? (Here ^ represents the bitwise XOR operation.)

Input

The first line of the input gives the number of test cases, TT test cases follow. Each case begins with one line with two space-separated integers, N and K, as described above. Then, four more lines follow. Each has N space-separated integers and represents the ID numbers of the robots auditioning for a certain position in the band.

Output

For each test case, output one line containing "Case #x: y", where x is the test case number (starting from 1) and y is the number of different bands that meet the conditions.

Limits

1 ≤ T ≤ 10.
0 ≤ K ≤ 109.
0 ≤ all robot numbers ≤ 109.

Small dataset

1 ≤ N ≤ 50.

Large dataset

1 ≤ N ≤ 1000.

Sample


Input 
 

Output 
 
2
2 3 
0 0
2 0
0 0
0 1
2 0
1 10
1 10
1 10
1 10

Case #1: 4
Case #2: 8

In sample case #1, in order to get a combined bitwise XOR of 3, the robot chosen from the second list must be 2, and the robot chosen from the fourth list must be 1. For the first and third lists, either of the two 0 robots can be chosen, so there are 2 * 2 = 4 possible bands that meet the criteria. Note that even though all of these bands are of the form (0, 2, 0, 1), they are considered different because the selections from the lists were different.



第一和第二行异或,第三和第四行异或,两边映射;

#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <unordered_map>
using namespace std;

unordered_map<int, long long int> mp;

int main()
{

    
    int t,T,N,K;
    int i,j;
    
    cin>>T;
    for(t=1;t<=T;t++)
    {
        cin>>N>>K;
        int v;
        vector<int> a,b,c,d;
        
        mp.clear();
        for(i=0;i<N;i++)
        {
            cin>>v;
            a.push_back(v);
        }
        
        for(i=0;i<N;i++)
        {
            cin>>v;
            b.push_back(v);
        }
        
        for(i=0;i<N;i++)
        {
            cin>>v;
            c.push_back(v);
        }
        
        for(i=0;i<N;i++)
        {
            cin>>v;
            d.push_back(v);
        }
        
        for(i=0;i<N;i++)
            for(j=0;j<N;j++)
                mp[a[i]^b[j]]++;
        
        long long int ans=0;
        for(i=0;i<N;i++)
            for(j=0;j<N;j++)
            {
                if(mp.find(c[i]^d[j]^K)!=mp.end())
                    ans+=mp[c[i]^d[j]^K];
            }
        
        cout<<"Case #"<<t<<": "<<ans<<endl;

    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值