[HDU5968]异或密码

[HDU5968]异或密码

题目大意:

数据共(T(Tle100))组。每组给定一个长度为(n(nle100))的非负整数序列(A(A_ile1024))(m(mle100))个询问,每个询问包含一个整数(x_i(|x_i|le1024))。求该序列的子区间异或和与(x_i)接近程度值最小的区间长度;若有多个区间的异或和与(x_i)的接近程度值相同,则回答最长的区间长度。

思路:

求前缀异或和之后暴力枚举区间端点即可。

源代码:

#include<cstdio>
#include<cctype>
#include<climits>
#include<algorithm>
inline int getint() {
	register char ch;
	register bool neg=false;
	while(!isdigit(ch=getchar())) neg|=ch=='-';
	register int x=ch^'0';
	while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
	return neg?-x:x;
}
const int N=101;
int a[N];
int main() {
	for(register int T=getint();T;T--) {
		const int n=getint();
		for(register int i=1;i<=n;i++) {
			a[i]=a[i-1]^getint();
		}
		const int m=getint();
		for(register int i=0;i<m;i++) {
			const int x=getint();
			int min=INT_MAX,len;
			for(register int i=1;i<=n;i++) {
				for(register int j=0;j<i;j++) {
					if(std::abs((a[i]^a[j])-x)<min) {
						min=std::abs((a[i]^a[j])-x);
						len=INT_MIN;
					}
					if(std::abs((a[i]^a[j])-x)==min) {
						len=std::max(len,i-j);
					}
				}
			}
			printf("%d
",len);
		}
		puts("");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/skylee03/p/9812442.html