标签:F1 XOR cf1582 int 元素 异或 INF 末尾 子列
题意:
给定长为n的数组a,求a的严格上升子序列的异或和的所有可能取值。
n<=1e5, 0<=a[i]<=500
思路:
注意到元素范围特别小,所有异或和都小于512。
f[i]
表示所有异或和为 i
的上升子列中,末尾元素最小的那个子列的末尾元素。f[i]=INF
表示还没有子列的异或和为 i
。每个 a[i]
可以加到在它之前的、末尾小于 a[i]
的子列的后面,并得到新的异或和 f[j]^a[i]
,从而更新 f[f[i]^a[i]]
。
另外注意空的子列也是合法的。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, M = 520, INF = 0x3f3f3f3f;
int n, a[N], f[M];
signed main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
memset(f, 0x3f, sizeof f); f[0] = 0; //空的子列
for(int i = 1; i <= n; i++)
for(int j = 0; j < M; j++)
if(f[j] < a[i]) f[j^a[i]] = min(f[j^a[i]], a[i]);
vector<int> ans;
for(int i = 0; i < M; i++) if(f[i]<INF) ans.push_back(i);
printf("%d\n", ans.size()); for(int i : ans) printf("%d ", i);
return 0;
}
标签:F1,XOR,cf1582,int,元素,异或,INF,末尾,子列 来源: https://www.cnblogs.com/wushansinger/p/15704841.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。