給定乙個長度為 \(n\) 的數列 \(a_i\),求 \(a_i\) 的子串行 \(b_i\) 的最長長度 \(k\),滿足 \(b_i \& b_ \ne 0\),其中 \(2\leq i\leq k\), $ &$ 表示位運算取與。
輸入檔案共 \(2\) 行。 第一行包括乙個整數 \(n\)。 第二行包括 \(n\) 個整數,第 \(i\) 個整數表示 \(a_i\)。
輸出檔案共一行。 包括乙個整數,表示子串行 \(b_i\) 的最長長度。
輸入 #1
3
1 2 3
輸出 #1
2
對於任意乙個數 \(b_i\) 要滿足條件 \(b_i\&b_ \ne 0\) ,\(namo\)
\(b_i\) 中存在二進位制為 \(1\) 的位置與 \(b_\) 中二進位制為 \(1\) 的位置存在交集
目前而言只知道 \(b_i\) 需要尋找交集,則就是去進行列舉每乙個位置,當 \(b_i\) 的這個位置二進位制為 \(1\) ,進行尋找最大值
\(b[i] = max(b[j]+1)\) 當 \(b_i\&b_j \ne 0\)
算到這裡時間複雜度是 \(o(n^2)\) ,需要進行優化,
\(namo\) 就是儲存一下記錄 \(i\) 最近的,當前位置的二進位制為 \(1\) 的位置。
也就是說使用乙個陣列 \(cnt\) ,\(cnt_j\) 表示距離當前位置最近並且 \(b_k\) 的第 \(j\) 的二進位制為 \(1\) 的位置
**
#include #include #include using namespace std;
typedef long long ll;
const int maxn = 1e5+55;
int cnt[80];
ll a[maxn];
int b[maxn];
int main()
} maxx=max(maxx,b[i]);
} printf("%d\n",maxx);
return 0;
}
luogu P4310 絕世好題
題面傳送門 這道d pdp dp還是比較水的 首先考慮設f if i fi 為以a ia i ai 結尾的最長長度,則向前迴圈列舉找到適合的轉移就可以了,時間複雜度o n 2 o n 2 o n2 估計80 8080 分正解也不是很難想,因為這是位運算,所以我們要找到位運算的性質,的性質就是兩個數至...
P4310 絕世好題
給定乙個長度為n的數列ai,求ai的子串行bi的最長長度,滿足bi bi 1 0 2 i len 輸入格式 輸入檔案共2行。第一行包括乙個整數n。第二行包括n個整數,第i個整數表示ai。輸出格式 輸出檔案共一行。包括乙個整數,表示子串行bi的最長長度。輸入樣例 1 3 1 2 3 輸出樣例 1 2 ...
P4310 絕世好題
題目描述 給定乙個長度為n的數列ai,求ai的子串行bi的最長長度,滿足bi bi 1 0 2 i len 說明對於100 的資料,1 n 100000,ai 10 9。錯誤日誌 沒搞清 每一位的dp值如何更新記錄陣列 乙個數 a 可以接在數 b 後面,當他們在二進位制下有相同位同為 1 時成立 這...