文章目錄
- 題名:
- 題意:
- 題解:
- 代碼:
題名:
Cat, Fox and the Lonely Array
題意:
給定一個數組a,求出最小的k,滿足數組每個長度為k的連續子數組元素按位或答案都相等。
題解:
可以想象成一個長度為k滑動窗口,每次向后移動移動一個位置,只需要保證當前窗口的首元素,與向后滑動一個位置新添加的元素對相或貢獻一致即可,因為兩個數相或有一個為一,答案就為一。
代碼:
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 1e5 + 6;
int t, n;
int a[MAXN];
bool check(int mid)
{vector<int> arr(22, 0);for(int i=1;i<=mid;i++){for(int j=0;j<=20;j++){if ((a[i]>>j)&1){arr[j+1]++;}}}for(int i=1;i+mid<=n;i++){for (int j=0;j<=20;j++){if ((a[i]>>j)&1) {arr[j+1]--;if(arr[j+1]==0){arr[j+1]=-1;}}}for (int j=0;j<=20;j++){if ((a[i + mid]>>j)&1){if (arr[j+1]>0){arr[j+1]++; } else if(arr[j+1]==-1) {arr[j+1]=1; }else if(arr[j+1]==0) {return false;}}else {if(arr[j+1]==-1) {return false;}}}}return true;
}int main()
{cin>>t;while(t--) {cin >> n;for (int i=1;i<=n;i++) {cin>>a[i];}int l=1,r=n,ans=0;while(l<=r){int mid=(l + r)>>1;if(check(mid)){r=mid-1;ans= mid;}else{l=mid+1; }}cout<<ans<<endl;}return 0;
}