HDU 5968(异或计算 暴力)

题意是在一个数列中找到一段连续的子串使其异或值与所给值最接近,求出子串长度,若有多组结果,输出最大长度。

做题之前一定多注意数据范围,这道题就可以直接暴力,用数组 p[ i ][ j ] 表示长度为 i 的数的第 j+1(从 0 开始)个异或值。

代码如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[102];
 4 int p[102][102];
 5 int main()
 6 {
 7     int t,n,m,len,minl,r;
 8     scanf("%d",&t);
 9     while(t--)
10     {
11         scanf("%d",&n);
12         for(int i = 0; i < n; ++i)
13             scanf("%d",&a[i]);
14         memset(p,0,sizeof(p));
15         for(int i = 0; i < n; ++i)
16             for(int j = 0; j < n-i; ++j)
17                 for(int k = j; k <= j+i; ++k)
18                     p[i][j]^=a[k];
19         scanf("%d",&m);
20         while(m--)
21         {
22             minl = 0xfffffff;
23             scanf("%d",&r);
24             for(int i = 0; i < n; ++i)
25                 for(int j = 0; j < n-i; ++j)
26                 {
27                     if(abs(p[i][j]-r) < minl)
28                     {
29                         minl = abs(p[i][j]-r);
30                         len = i+1;
31                     }
32                     if(i+1>len && abs(p[i][j]-r)==minl)
33                         len = i+1;
34                 }
35             printf("%d\n",len);
36         }
37         printf("\n");
38     }
39     return 0;
40 }
View Code

感谢这篇博客的作者:

https://blog.csdn.net/dt_zhangshuo/article/details/53056486

posted @ 2018-10-07 10:11  Taskr  阅读(238)  评论(0编辑  收藏  举报
Live2D