a题目描述
给出一个正整数序列A;,求一个子区间使得这个区间内的数
或起来尽可能的大。
或运算指数字按二进制位进行以下运算:
运算规则: 0|0= 0,0|1= 1,1|0= 1,1|1= 1
一个序列的子区间指这个序列中连续的一段数字。
牛牛并不关心这个最大值是多少,他只关心所有满足条件的
子区间里,最短的子区间长度是多少。
输入描述:
第一行一个正整数n,代表这个序列的长度。
接下来一行空格分隔的正整数Ai,用来描述这个序列。
1≤n≤106
1≤Ai≤109
输出描述:
仅一行一个正整数代表答案。
示例1输入输出示例仅供调试,后台判题数据一般不包含示
例
输入
复制I
3
123
输出
复制
1
说明
最大值是3,满足条件的子区间为[1 :3),1:2],[3:3],
所以最短的长度为1。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll n;
cin>> n;
vector<ll> vec;
ll sum = 0;
ll biggest = 0;
ll flagi = 0;
for(ll i = 0; i < n; ++i){
ll tmp;
cin>> tmp;
sum |= tmp;
if(sum > biggest) {
biggest = sum;
flagi = i + 1;
}
vec.push_back(tmp);
}
for(ll i = 1; i < n; ++i){
sum = 0;
for(ll j = i; j < n; ++j){
sum |= vec[j];
if(sum == biggest){
flagi = (flagi <= j - i + 1) ? flagi : (j - i + 1);
break;
}
}
}
cout<< flagi << endl;
return 0;
}