#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std ;
#define int long long
signed main(){
int k;
int c,d=0;
cin>>k;
int e[k]={0};
for(int i=0;i<k;i++){
int n,m;
cin>>n>>m;
int a[n];
int b[m];
for(int j=0;j<n;j++){
scanf("%lld",&a[j]);
}
for(int j=0;j<m;j++){
scanf("%lld",&b[j]);
}
int l=0;
for(int j,k=0;j<n&&k<m;l++){
if(a[j]>=b[k]){
if(a[j]==b[k])c++;
if(k==m-1)d=c^d;
k++;
}
if(a[j]<b[k]){
d=c^d;
c=0;
j++;
}
}
e[i]=d;
}
for(int i=0;i<k;i++){
printf("%lld\n",e[i]);
}
return 0;
}
#include<iostream>
#include<vector>
using namespace std ;
signed main(){
int k;
int c,d=0;
cin>>k;
int e[k]={0};
for(int i=0;i<k;i++){
int n,m;
cin>>n>>m;
int a[n];
int b[m];
for(int j=0;j<n;j++){
scanf("%d",&a[j]);
}
for(int j=0;j<m;j++){
scanf("%d",&b[j]);
}
int l=0;
for(int j,k=0;j<n&&k<m;l++){
if(a[j]>=b[k]){
if(a[j]==b[k])c++;
if(k==m-1)d=c^d;
k++;
}
if(a[j]<b[k]){
d=c^d;
c=0;
j++;
}
}
e[i]=d;
}
for(int i=0;i<k;i++){
printf("%d\n",e[i]);
}
return 0;
}
给出两个数列 $a, b$,均按不降序排序。其中保证 $a$ 中没有重复的数字。
现在请你求出:$a$ 中每一个数字在 $b$ 中出现了几次?
本题单测试点内有多组测试数据。
输入的第一行是一个整数,表示数据组数 $T$。接下来按顺序给出每组数据的输入信息:
第一行为两个整数,依次表示 $a$ 数列的长度 $n$ 和 $b$ 数列的长度 $m$。
第二行有 $n$ 个整数表示数列 $a$,第 $i$ 个整数表示 $a_i$。
第三行有 $m$ 个整数表示数列 $b$,第 $i$ 个整数表示 $b_i$。
为了避免输出过大,对于每组数据,请你输出一行一个整数,表示数列 $a$ 的每个数在 $b$ 中出现次数的按位异或和。
形式化的,设 $a_i$ 在 $b$ 中出现了 $c_i$ 次,则你需要输出 $c_1 \bigoplus c_2 \bigoplus \dots \bigoplus c_n$ 的值,其中 $\bigoplus$ 表示按位异或操作。你可以参考提示来完成计算。
1
3 5
1 3 6
1 3 3 5 5
3
1
9 4
1 2 3 4 5 6 7 8 9
1 1 4 5
2
2
3 5
1 3 6
1 3 3 5 5
9 4
1 2 3 4 5 6 7 8 9
1 1 4 5
3
2
故输出为 $1 \bigoplus 2 = 3$。
$1, 4, 5$ 分别在 $b$ 中出现了 $2, 1, 1$ 次,故输出为 $2 \bigoplus 1 \bigoplus 1 = 2$。
对于全部的测试点,保证:
其中 $\sum (n+m)$ 表示单测试点内所有 $n$ 与 $m$ 的和,即输入数列的总长度不超过 $10^7$。
template <class T>
T getXorSum(T *begin, T *end) {
T ret = 0;
for (T *it = begin; it != end; ++it) ret ^= *it;
return ret;
}
这一函数的作用是计算传入数组(包括 std::vector
)某一左闭右开区间的按位异或和,返回值类型与传入数组的类型相同,调用方法与 std::sort
类似,例如,要求数组 $a$ 的 $a_1 \sim a_n$ 的按位异或和,则调用 getXorSum(a + 1, a + 1 + n)
,求 $a_0 \sim a_{n - 1}$ 的按位异或和,则调用 getXorSum(a, a + n)
。如果 $a$ 是 std::vector
,则将上述调用代码里的 a
均改为 a.begin()
即可。
您好,我对代码做了小小的修改,目前可以通过样例。
#include<iostream>
#include<vector>
using namespace std ;
long long e[10000005]={};
unsigned long long a[10000005]={};
unsigned long long b[10000005]={};//定义很大的数组要放在外面
signed main(){
int k;
cin>>k;
for(int i=0;i<k;i++){
long long c=0,d=0;//c要赋初值
int n,m;
cin>>n>>m;
for(int j=0;j<n;j++){
cin>>a[j];
}
for(int j=0;j<m;j++){
cin>>b[j];
}
int j=0,k=0;
while(j<n&&k<m){//for改while(其实一样的),省一个变量l
if(a[j]>=b[k]){
if(a[j]==b[k])c++;
if(k==m-1)d=c^d;
k++;
}
else if(a[j]<b[k]){//else
d=c^d;
c=0;
j++;
}
}
e[i]=d;
}
for(int i=0;i<k;i++){
printf("%lld\n",e[i]);//输出要%lld(其实e数组可以是int)
}
return 0;
}
你说的long long在哪呢?如果是数组类型改成了long long,那用scanf("%lld",&a[i]);就行输入,不能用%d
把%d换成%ld试试
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!