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 }
感谢这篇博客的作者:
日后若能有更好的想法,再来完善。
希望看到的大神不吝赐教 orz