1. 程式人生 > >hdu 5968 異或密碼

hdu 5968 異或密碼

ota nbsp 告訴 絕對值最小 element tle 異或 條件 otto

異或密碼

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 }

hdu 5968 異或密碼