C - 异或密码 HDU - 5968 解题报告

这道题,我一开始的答题思路基本正确,就是前缀XOR数组(听着很厉害其实很简单)+暴力枚举,但是这道题还是WA了,原因是有一些细节没搞清楚,我记得在不久前的博客中写到了自己犯过同样的错误,唉。。。真的是不长记性,在这里再说一下,一定要注意题意中给你的优先级,是现以最大值为基准,还是先以最长子序列为基准,第二优先级是随着第一优先级的改变而改变的,当第一优先级相等时,才会考虑第二优先级的大小,这一点非常的重要。

本题所用到的知识点:
1、a^a^b=b, 0^b=b, A^A=0.(所以可以使用前缀)
2、^运算符优先级是小于‘ - ’的所以要使用括号。 各个运算符的优先级
题目链接:https://vjudge.net/problem/HDU-5968

下面给出AC代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn=100+10;
const int INF=0x3f3f3f3f;

int a[maxn],pre[maxn];

int main()
{
    int T;  scanf("%d",&T);
    while(T--)
    {
        int n;  scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);

        pre[0]=0;
        for(int i=1;i<=n;i++)
        {
              pre[i]=pre[i-1]^a[i];
        }
//        for(int i=1;i<=n;i++)
//            cout<<pre[i]<<"    ";
//        cout<<endl;
        int m; scanf("%d",&m);
        while(m--)
        {
            int re; scanf("%d",&re);

            int minn=INF,len=-1;
            for(int i=1;i<=n;i++)
            {
                for(int j=i;j<=n;j++)
                {
                    int t=abs((pre[j]^pre[i-1])-re);
                    if(minn>t)
                    {
                        minn=t;
                        len=j-i+1;
                    }
                    else if(minn==t)
                    {
                        len=max(len,j-i+1);
                    }
                }
            }
            printf("%d\n",len);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/NCC__dapeng/article/details/82077741