P11008 『STA - R7』异或生成序列 题解
提示:这是一篇不是正解的题解。
题目大意很明确,这里不再重述。
思路:
让我们充分发扬人类智慧(
根据异或运算的基本性质,若两个数同时异或会被消掉,比如
观察题目,容易发现将
即:
再根据异或运算的另一个性质:若
也就是说,我们只要知道了一个
我们先维护一个异或的类似前缀和的数组
但这样的做法是
发现瓶颈在于找合法
由于原数列是一个
所以开一个桶提前标记
#include <cmath>
#include <ctime>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 2000010;
int T, n;
int a[N], sum[N];
int ans[N];
int cnt;
bool st[N];
int main() {
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
for(int i = 1; i < n; i++) {
scanf("%d", &a[i]);
sum[i] = sum[i - 1] ^ a[i];
st[sum[i]] = true; //标记不能取的值
}
for(int p1 = 1; p1 <= n; p1++) {
if(st[p1]) continue; //玄学剪枝
ans[1] = p1;
bool flag = true;
for(int j = 2; j <= n; j++) {
int tmp = sum[j - 1] ^ p1;
if(tmp > n) {
flag = false;
break;
}
ans[j] = tmp;
}
if(flag) {
for(int j = 1; j <= n; j++)
printf("%d ", ans[j]);
puts("");
break;
}
}
for(int i = 1; i < n; i++) st[sum[i]] = false; //记得最后还原
}
return 0;
}
这里我才刚把不等于 (加强数据迫在眉睫)
欢迎大佬给出详细的时间复杂度的证明或 hack。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步