题目链接
https://www.matiji.net/exam/brushquestion/21/4347/179CE77A7B772D15A8C00DD8198AAC74
小度最近在研究超导材料,他合成了 N 个新材料排成一排,而每个材料根据基于流程会设置一个编号 P,表示种类。 小度发现相同种类的材料在距离小于等于 K 的情况下会发生发应。
小度想知道哪些种类的材料会发生反应,输出这些种类 P 的异或值。
该题可用简单哈希表存材料所在的位置,与后续相同材料比较,得出结果。
代码注释如下:
#include<bits/stdc++.h>
using namespace std;
const int N=50010;
int a[N],m[N],n,k,t=0; //t用来记录会发生反应的材料m[N]
map<int,bool>mp; //用于判重,如果改材料已经被m记录,便不再计算
int Hash[1000010]; //哈希表
int main()
{
memset(Hash,-1,sizeof(Hash));//材料编号有可能为零,所以初始化为一
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(Hash[a[i]]==-1){ //材料第一次读入,直接赋初值
Hash[a[i]]=i;
}
else if(!mp[a[i]]){ //如果材料已经存入m数组,不再判断
if(i-Hash[a[i]]<=k){//计算当前位置和上一次记录的距离,并判断材料是否会发生反应
m[t++]=a[i];
mp[a[i]]=true;
}
else{ //否则更新当前材料的最新位置,方便与后续相同材料比较
Hash[a[i]]=i;
}
}
}
int ans=0; //任何数异或0都等于它本身
for(int i=0;i<t;i++){
ans^=m[i];
}
cout<<ans<<endl; //得出答案
return 0;
}