题目链接
题目大意
给出n个数,在任意去掉一个数之后,求剩下所有数的与,或,异或
思路
思路一
前缀后缀和,先提前记录,之后一次性输出
思路二
用异或运算的性质
代码
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
const int maxN = 100005;
int pre1[maxN];
int pre2[maxN];
int pre3[maxN];
int suf1[maxN];
int suf2[maxN];
int suf3[maxN];
int a[maxN];
int n,q,x;
int main()
{
while(cin>>n>>q) //注意有多组输入
{
for(int i=1; i<=n; ++i)
{
//cin>>a[i];
scanf("%d",&a[i]);
}
pre1[1] = pre2[1] = pre3[1] = a[1];
for(int i=2; i<=n; ++i)
{
pre1[i] = pre1[i-1] & a[i];
pre2[i] = pre2[i-1] | a[i];
pre3[i] = pre3[i-1] ^ a[i];
}
suf1[n] = suf2[n] = suf3[n] = a[n];
for(int i=n-1; i>=1; --i)
{
suf1[i] = suf1[i+1] & a[i];
suf2[i] = suf2[i+1] | a[i];
suf3[i] = suf3[i+1] ^ a[i];
}
while(q--)
{
// cin>>x;
scanf("%d",&x);
if(x==1)
{
cout << suf1[x+1] << " "
<< suf2[x+1] << " "
<< suf3[x+1] << endl;
}
else if(x==n)
{
cout << pre1[x-1] << " "
<< pre2[x-1] << " "
<< pre3[x-1] << endl;
}
else
{
//必须是printf,否则会TLE
printf("%d %d %d\n",(pre1[x-1] & suf1[x+1]),(pre2[x-1] | suf2[x+1]),(pre3[x-1] ^ suf3[x+1]));
}
}
}
return 0;
}
总结
TLE了好几次,才发现是cout的问题,以后还是用prinft叭