P15078 [ICPC 2024 Chengdu R] Expanding Array题解

P15078 [ICPC 2024 Chengdu R] Expanding Array

题目描述

给定一个长度为 nnn 的整数数组 a1,a2,…,ana_1, a_2, \ldots, a_na1,a2,,an,你可以对该数组执行任意次操作。在每次操作中,你可以选择两个相邻元素 aia_iaiai+1a_{i+1}ai+11≤i<n1 \le i < n1i<n),并在它们之间插入以下三个值之一:ai and ai+1a_i \ \texttt{and}\ a_{i+1}ai and ai+1ai or ai+1a_i \ \texttt{or}\ a_{i+1}ai or ai+1ai⊕ai+1a_i \oplus a_{i+1}aiai+1。你的任务是确定在执行任意次操作后,数组中最多可以存在多少种不同的值。

注意:\textbf{注意:}注意: x and yx \ \texttt{and}\ yx and y 表示 xxxyyy 的按位与。x or yx \ \texttt{or}\ yx or y 表示 xxxyyy 的按位或。x⊕yx \oplus yxy 表示 xxxyyy 的按位异或。

输入格式

  • 第一行包含一个整数 nnn2≤n≤1052 \le n \le 10^52n105),表示数组的长度。
  • 第二行包含 nnn 个整数 a1,a2,…,ana_1, a_2, \ldots, a_na1,a2,,an0≤ai≤1090 \le a_i \le 10^90ai109),表示数组的元素。

输出格式

输出一个整数,表示在执行任意次操作后,数组中最多可以获得的不同的值的数量。

输入输出样例 #1

输入 #1

2
2 3

输出 #1

4

输入输出样例 #2

输入 #2

2
3 4

输出 #2

4

说明/提示

翻译由 DeepSeek V3 完成

思路

数学题,手算一下可能即可。

代码见下

#include<bits/stdc++.h> 
using namespace std;
long long n,a[100005],wd=0,b;
map<long long,long long> mp;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(mp[a[i]]==0){
			mp[a[i]]=1;
			wd++;
		}
		if(i!=1){
			b=a[i-1];
			if(mp[(a[i-1]|a[i])]==0){
				mp[(a[i-1]|a[i])]=1;
				wd++;
			}
			if(mp[(a[i-1]&a[i])]==0){
				mp[(a[i-1]&a[i])]=1;
				wd++;
			}
			if(mp[(a[i-1]^a[i])]==0){
				mp[(a[i-1]^a[i])]=1;
				wd++;
			}
			if(mp[((a[i-1]^a[i])|a[i])]==0){
				mp[((a[i-1]^a[i])|a[i])]=1;
				wd++;
			}
			if(mp[((a[i-1]^a[i])&a[i])]==0){
				mp[((a[i-1]^a[i])&a[i])]=1;
				wd++;
			}
			if(mp[((a[i-1]^a[i])|b)]==0){
				mp[((a[i-1]^a[i])|b)]=1;
				wd++;
			}
			if(mp[((a[i-1]^a[i])&b)]==0){
				mp[((a[i-1]^a[i])&b)]=1;
				wd++;
			}
			if(mp[(a[i]|(a[i-1]^a[i]))]==0){
				mp[(a[i]|(a[i-1]^a[i]))]=1;
				wd++;
			}
			if(mp[(b|(a[i-1]^a[i]))]==0){
				mp[(b|(a[i-1]^a[i]))]=1;
				wd++;
			}
			if(mp[(a[i]&(a[i-1]^a[i]))]==0){
				mp[(a[i]&(a[i-1]^a[i]))]=1;
				wd++;
			}
			if(mp[(b&(a[i-1]^a[i]))]==0){
				mp[(b&(a[i-1]^a[i]))]=1;
				wd++;
			}
			if(mp[(a[i]^(a[i-1]&a[i]))]==0){
				mp[(a[i]^(a[i-1]&a[i]))]=1;
				wd++;
			}
			if(mp[(a[i]^(a[i-1]|a[i]))]==0){
				mp[(a[i]^(a[i-1]|a[i]))]=1;
				wd++;
			}
			if(mp[(b^(a[i-1]&a[i]))]==0){
				mp[(b^(a[i-1]&a[i]))]=1;
				wd++;
			}
			if(mp[(b^(a[i-1]|a[i]))]==0){
				mp[(b^(a[i-1]|a[i]))]=1;
				wd++;
			}
			if(mp[(a[i]|(a[i-1]&a[i]))]==0){
				mp[(a[i]|(a[i-1]&a[i]))]=1;
				wd++;
			}
			if(mp[(b|(a[i-1]&a[i]))]==0){
				mp[(b|(a[i-1]&a[i]))]=1;
				wd++;
			}
			if(mp[(a[i]&(a[i-1]|a[i]))]==0){
				mp[(a[i]&(a[i-1]|a[i]))]=1;
				wd++;
			}
			if(mp[(b&(a[i-1]|a[i]))]==0){
				mp[(b&(a[i-1]|a[i]))]=1;
				wd++;
			}
		}
	}
	if(mp[0]==0){
		wd++;
		mp[0]=1;
	}
	cout<<wd<<endl;
	return 0; 	
}
posted @ 2026-01-26 21:10  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源