首页 > 代码库 > hdu_5968_异或密码(预处理+二分)
hdu_5968_异或密码(预处理+二分)
题目链接:hdu_5968_异或密码
题意:
中午,不解释
题解:
前缀处理一下异或值,然后上个二分查找就行了,注意是unsigned long long
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 typedef long long ll; 5 6 const int N=111; 7 int t,dp[N],a[N],n,m,tp; 8 9 10 struct dt 11 { 12 int val,len; 13 bool operator<(const dt &b)const 14 { 15 return val<b.val; 16 } 17 }s[N*N],ttp; 18 bool cmp(dt a,dt b) 19 { 20 if(a.val==b.val)return a.len>b.len; 21 return a.val<b.val; 22 } 23 int main() 24 { 25 scanf("%d",&t); 26 while(t--) 27 { 28 scanf("%d",&n); 29 F(i,1,n)scanf("%d",a+i); 30 F(i,1,n)dp[i]=dp[i-1]^a[i]; 31 int ed=0; 32 F(j,1,n)F(k,j,n) 33 { 34 s[++ed].val=dp[k]^dp[j-1]; 35 s[ed].len=k-j+1; 36 } 37 sort(s+1,s+1+ed,cmp); 38 scanf("%d",&m); 39 F(i,1,m) 40 { 41 scanf("%d",&tp); 42 ttp.val=tp; 43 int now1=lower_bound(s+1,s+1+ed,ttp)-s,ans; 44 int now2=now1-1; 45 now2=lower_bound(s+1,s+1+ed,s[now2])-s; 46 if(now1>ed)now1=ed; 47 int n1=abs(s[now1].val-tp),n2=abs(s[now2].val-tp); 48 if(n1>n2)ans=now2; 49 else if(n1<n2)ans=now1; 50 else if(s[now1].len>s[now2].len)ans=now1; 51 else ans=now2; 52 printf("%d\n",s[ans].len); 53 } 54 puts(""); 55 } 56 return 0; 57 }
hdu_5968_异或密码(预处理+二分)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。