hdu 5968 异或密码

异或密码

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1758    Accepted Submission(s): 577


Problem Description
晨晨在纸上写了一个长度为N的非负整数序列{ai}。对于这个序列的一个连续子序列{al,al+1,ar}晨晨可以求出其中所有数异或的结果 alxoral+1xor...xorar其 中xor表示位异或运算,对应C、C++、 Java等语言中的^运算。
小璐提出了M个询问,每个询问用一个整数 xi描述。
对于每个询问,晨晨需要找到序列{ai}的所有连续子序列,求出每个子序列异或的结果,找到所有的结果中与 xi之差的绝对值最小的一个,并告诉小璐相应子序列的长度。
若有多个满足条件的连续子序列,则告诉小璐这些子序列中最长的长度。
 

 

Input
包含多组测试数据,第一行一个正整数T,表示数据组数。
每组数据共两行。
第一行包含N+1个非负整数。其中第一个数为N,表示序列的长度;接下来N 个数,依次描述序列{ ai}中的每个数。
第二行包含M+1个整数。其中第一个数为M,表示询问的个数;接下来M个数 xi,每个数对应题目描述中的一个询问。
保证 1 <= N <= 100,1 <= M <= 100,ai <= 1024,|xi| <= 1024,数据组数 <= 100。
 

 

Output
对于每组数据输出M + 1行。前M行对应晨晨M个询问的回答,第M + 1行为空行
 

 

Sample Input
2 2 1 1 2 0 2 3 1 2 4 3 10 5 1
 

 

Sample Output
2 1 3 2 1
 

 思路:暴力

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=105;
 4 
 5 int a[N];
 6 int n;
 7 set<int > s[2100],ss;
 8 set<int >::iterator it,it1,it2;
 9 int main(){
10     int  t;
11     cin>>t;
12     while(t--){
13         scanf("%d",&n);
14         ss.clear();
15         for(int i=0;i<=2100;i++) s[i].clear();
16         for(int i=1;i<=n;i++){
17             scanf("%d",&a[i]);
18             s[a[i]].insert(1);
19             ss.insert(a[i]);
20         }
21         for(int i=1;i<=n;i++){
22             int x=a[i];
23             for(int j=i+1;j<=n;j++){
24                 x=x^a[j];
25                 ss.insert(x);
26                 if(!s[x].empty()){
27                     if(*s[x].begin()<(j-i+1)){
28                         int y=*s[x].begin();
29                         s[x].erase(y);
30                         s[x].insert(j-i+1);
31                     }
32                 }
33                 else
34                 s[x].insert(j-i+1);
35             }
36         }
37         int q;
38         scanf("%d",&q);
39         while(q--){
40             int m;
41             scanf("%d",&m);
42             it=ss.upper_bound(m);
43             if(it!=ss.end()){
44                 int xx=*it;
45                 if(it!=ss.begin()){
46                     it--;
47                     int yy=*it;
48                     if(abs(yy-m)<abs(xx-m)){
49                         printf("%d\n",*(s[yy].begin()));
50                     }
51                     else if(abs(yy-m)>abs(xx-m)){
52                         printf("%d\n",*(s[xx].begin()));
53                     }
54                     else {
55                             printf("%d\n",max(*(s[xx].begin()),*(s[yy].begin())));
56                     }
57                 }
58                 else {
59                     printf("%d\n",*(s[xx].begin()));
60                 }
61             }
62             else {
63                 it--;
64                 printf("%d\n",*(s[*it].begin()));
65             }
66         }
67         printf("\n");
68     }
69     return 0;
70 }

 

posted on 2017-09-29 14:17  hhhhx  阅读(159)  评论(0编辑  收藏  举报

导航