hdu 5968 異或密碼
阿新 • • 發佈:2017-09-29
ota nbsp 告訴 絕對值最小 element tle 異或 條件 otto
小璐提出了M個詢問,每個詢問用一個整數 xi 描述。
對於每個詢問,晨晨需要找到序列{ai}的所有連續子序列,求出每個子序列異或的結果,找到所有的結果中與 xi之差的絕對值最小的一個,並告訴小璐相應子序列的長度。
若有多個滿足條件的連續子序列,則告訴小璐這些子序列中最長的長度。
每組數據共兩行。
第一行包含N+1個非負整數。其中第一個數為N,表示序列的長度;接下來N 個數,依次描述序列{ ai}中的每個數。
第二行包含M+1個整數。其中第一個數為M,表示詢問的個數;接下來M個數 xi,每個數對應題目描述中的一個詢問。
保證 1 <= N <= 100,1 <= M <= 100,ai <= 1024,|xi| <= 1024,數據組數 <= 100。
異或密碼
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1758 Accepted Submission(s): 577
小璐提出了M個詢問,每個詢問用一個整數 xi
對於每個詢問,晨晨需要找到序列{ai}的所有連續子序列,求出每個子序列異或的結果,找到所有的結果中與 xi之差的絕對值最小的一個,並告訴小璐相應子序列的長度。
若有多個滿足條件的連續子序列,則告訴小璐這些子序列中最長的長度。
Input 包含多組測試數據,第一行一個正整數T,表示數據組數。
每組數據共兩行。
第一行包含N+1個非負整數。其中第一個數為N,表示序列的長度;接下來N 個數,依次描述序列{ ai}中的每個數。
第二行包含M+1個整數。其中第一個數為M,表示詢問的個數;接下來M個數 xi,每個數對應題目描述中的一個詢問。
保證 1 <= N <= 100,1 <= M <= 100,ai
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 異或密碼