HDU 6186 CS Course(前缀+后缀)

http://acm.hdu.edu.cn/showproblem.php?pid=6186

题意:
给出n个数,共有n次询问,每次询问给出一个数p,求除去第p个数后的n-1个数的&、|、^值。

思路:
分别计算出&、|、^的前缀和后缀,将前缀和后缀相计算即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn = 1e5+5;
 6 
 7 int n, q;
 8 int a[maxn], prea[maxn], suffa[maxn], preo[maxn], suffo[maxn], prex[maxn], suffx[maxn];
 9 
10 int main()
11 {
12     //freopen("in.txt","r",stdin);
13     while(~scanf("%d%d",&n,&q))
14     {
15         scanf("%d",&a[1]);
16         prea[1] = preo[1] = prex[1] = a[1];
17         for(int i=2;i<=n;i++)
18         {
19             scanf("%d",&a[i]);
20             prea[i] = a[i] & prea[i-1];
21             preo[i] = a[i] | preo[i-1];
22             prex[i] = a[i] ^ prex[i-1];
23         }
24         suffa[n] = suffo[n] = suffx[n] = a[n];
25         for(int i=n-1;i>=1;i--)
26         {
27             suffa[i] = a[i] & suffa[i+1];
28             suffo[i] = a[i] | suffo[i+1];
29             suffx[i] = a[i] ^ suffx[i+1];
30         }
31         while(q--)
32         {
33             int pos; scanf("%d",&pos);
34             int ans1 = prea[pos-1] & suffa[pos+1];
35             int ans2 = preo[pos-1] | suffo[pos+1];
36             int ans3 = prex[pos-1] ^ suffx[pos+1];
37             if(pos==1)
38             {
39                 ans1 = suffa[pos+1];
40                 ans2 = suffo[pos+1];
41                 ans3 = suffx[pos+1];
42             }
43             if(pos==n)
44             {
45                 ans1 = prea[pos-1];
46                 ans2 = preo[pos-1];
47                 ans3 = prex[pos-1];
48             }
49             printf("%d %d %d
", ans1, ans2, ans3);
50         }
51     }
52     return 0;
53 }
原文地址:https://www.cnblogs.com/zyb993963526/p/9309683.html