Just do it
Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 1104 Accepted Submission(s): 639
Problem Description
There is a nonnegative integer sequence
a1...n
of length
n
. HazelFan wants to do a type of transformation called prefix-XOR, which means
a1...n
changes into
b1...n
, where
bi
equals to the XOR value of
a1,...,ai
. He will repeat it for
m
times, please tell him the final sequence.
Input
The first line contains a positive integer
T(1≤T≤5)
, denoting the number of test cases.
For each test case:
The first line contains two positive integers n,m(1≤n≤2×105,1≤m≤109) .
The second line contains n nonnegative integers a1...n(0≤ai≤230−1) .
For each test case:
The first line contains two positive integers n,m(1≤n≤2×105,1≤m≤109) .
The second line contains n nonnegative integers a1...n(0≤ai≤230−1) .
Output
For each test case:
A single line contains n nonnegative integers, denoting the final sequence.
A single line contains n nonnegative integers, denoting the final sequence.
Sample Input
2 1 1 1 3 3 1 2 3
Sample Output
1 1 3 1
解析:
dp(i,j),推一次=dp(i-1,j)^dp(i,j-1),再推两次=dp(i-2,j)^dp(i,j-2).....->=dp(i-2^n,j)^dp(i,j-2^n)
这样i就可以一直从i-2^n的最小值(即n最大)一直往上推,这里可以刚好类似二进制的思想,,每一个m可以从m的1的最低位,一步步推向1的最高位。
例如m=13 (1101),先推1,再推5,此时x=4,因为dp(5,j)=dp(5-4,j)^dp(5,j-4),这样推出dp(5,j)需要dp(1,j)和dp(5,j-4),dp(1,j)再推1的时候已经推过了,dp(5,j-4)只需要从前往后遍历,这样dp[j]是1的状态,dp[j-4]是5的状态(具体见代码实现)
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<set>
using namespace std;
const int N = 2e5+5;
int dp[N];
int main() {
int T;
scanf("%d", &T);
while(T--) {
int n, m;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++) scanf("%d", &dp[i]);
while(m) {
int x = m&-m; //取m中的最低的1所在的位(lowbit位),sum+=x;
for(int j = x; j < n; j++) { //当前表示的是之前所有x的和的状态,dp[sum][j]=dp[sum-x][j]^dp[sum][j-x],x是当前sum中最高的1所在的位,即sum中所能减去的最大的2^n
dp[j] ^= dp[j-x]; //dp[j](sum状态)=dp[j](sum-x状态,即上一个循环sum的状态)^dp[j-x](sum状态)
}
m -= x;
}
for(int i=0;i<n;i++)
{
if(i!=n-1)
printf("%d ",dp[i]);
else
printf("%d\n",dp[i]);
}
}
return 0;
}