F1的暴力解法
题目要求:子串是升序,统计出现的升序子串能异或出现的所有数
- 记录出现的每个数中最小结尾的那个数,随后进行异或和枚举
#include<bits/stdc++.h>
#define x first
#define y second
#define int long long
using namespace std;
typedef pair<int,int>PII;
const int N=100007;
int n;
int a[N];
int vis[N];
int minn[1100];
void solve()
{
memset(minn,0x3f,sizeof minn);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
vis[0]=1,minn[0]=0;
for(int i=1;i<=n;i++)
for(int j=0;j<=1024;j++)//TODO: 枚举所有数
{
if(!vis[j])continue;//TODO: 判断是否出现
if(minn[j]<a[i])// 进行异或,更新得到j的最后一个数(取min)
{
vis[j^a[i]]=1;
minn[j^a[i]]=min(a[i],minn[j^a[i]]);
}
}
int ans=0;
for(int i=0;i<=1024;i++)ans+=vis[i];
cout<<ans<<endl;
for(int i=0;i<=1024;i++)
if(vis[i])cout<<i<<' ';
puts("");
}
signed main()
{
// ios::sync_with_stdio(false);
// cin.tie(nullptr);
int T=1;
// cin>>T;
while(T--)
solve();
return 0;
}