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之差的绝对值最小的一个,并告诉小璐相应子序列的长度。
若有多个满足条件的连续子序列,则告诉小璐这些子序列中最长的长度。
小璐提出了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。
每组数据共两行。
第一行包含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 }