hdu 5968 異或密碼 2016ACM/CCPC合肥賽區現場賽H




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

因為n和m都很小,所以直接預處理每一段區間的異或和存下來掃一遍即可

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 100;
const int M = 4000;
int a[N+10];
int dp[N+10][N+10];
int ans[M];
int main(void){
int t;
int n,m,i,j,x;
scanf("%d",&t);
while(t--){
memset(dp,0,sizeof(dp));
memset(ans,0,sizeof(ans));
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
dp[i][i] = a[i];
ans[dp[i][i]] = max(1,ans[dp[i][i]]);
for(j=i+1;j<n;j++){
dp[i][j] = dp[i][j-1]^a[j];
ans[dp[i][j]] = max(j-i+1,ans[dp[i][j]]);
}
}
//int x;
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%d",&x);
for(j=x;j>=0;j--)
if(ans[j]!=0)
break;
int d1=j;
for(j=x;j<=2047;j++)
if(ans[j]!=0)
break;
int d2=j;
if(d1<=-1)
d1=-2100000000;
if(d2>=2048)
d2=2100000000;
if(x-d1<d2-x)
printf("%d\n",ans[d1]);
else if(x-d1>d2-x)
printf("%d\n",ans[d2]);
else
printf("%d\n",max(ans[d1],ans[d2]));
}
printf("\n");
}



return 0;

}


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

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com