題目鏈結
題目大意
給乙個只有 \(\texttt\) 和 \(\texttt\) 的字串,求乙個 \(\texttt\) 和 \(\texttt\) 數量相同的區間,輸出這個區間的最大長度。
題解
1. 暴力
把所有 \(\texttt\) 標記為 \(1\),把所有 \(\texttt\) 標記為 \(-1\),求一下字首和陣列 \(s\)。
二重迴圈列舉左端點和右端點 \(i\),\(j\),如果 \(s_=s_j\)(即 \(s_j-s_=0\)),則說明當前區間為穩定區間。
如果當前區間為穩定區間,更新答案,最後輸出最大答案即可。
時間複雜度為 \(\mathcal o (n^2)\)。
2. 優化方案
由暴力的啟發,我們可以用乙個陣列 \(m\) 記錄每個字首和第一次出現的位置,之後再遇到這個字首和就會產生乙個穩定區間。
由於字首和可能為負數,所以把 \(m\) 陣列下標加上該字串的長度。
時間複雜度減小到 \(\mathcal o (n)\)。
**
\(\mathcal o (n^2)\) 暴力:
#include #include #include using namespace std;
char t[1000005];
int a[1000005], s[1000005], ans;
int main()
else if (t[i - 1] == 'g')
}for (int i = 1; i <= n; i++)
}for (int i = 1; i <= n; i++)}}
cout << ans;
return 0;
}
\(\mathcal o (n)\) 優化方案:
#include #include #include using namespace std;
int s[1000005], a[1000005], m[1000005], ans;
char t[1000005];
int main()
else
}for (int i = 1; i <= n; i++)
for (int i = 1; i <= 2 * n + 2; i++)
m[n + 1] = 0;
for (int i = 1; i <= n; i++)
else
}cout << ans;
return 0;
}
洛谷 P2697 寶石串
將紅色的設定為 1,綠色的為1,統計字首和sum,如果sum i sum j 則說明i j是乙個穩定的區間 因為答案要求最大,所以我們要記錄每個sum值的最左端點 也就是哪個位置第一次出現某個sum值 每當遇到某個sum值,便利用最左端點求出區間長度,更新答案 吐槽 洛谷標籤裡是個dp,我就沒往其他...
字首和(P2697 寶石串)
前言 每次做出來什麼本來做不出的題目,就忍不住記錄一下。不過大多時候隔幾天來看,就發現,啊,我當時只是做了一道這麼弱智的題目呀,哈哈。字首和確實不算太難。傳送門題目大意 給你乙個字串只含g和r,求乙個最長子串長度,使得兩個字元的長度相等。給的字串長小於1e6 如 grggrg 答案是 4。思路 題目...
洛谷 2343 寶石管理系統 題解
部落格觀賞效果更佳 給定乙個序列,維護兩種操作,加入乙個數,求第k kk大的數。很明顯這個題目珂以用平衡樹做。但是,有乙個引人深思的問題 你會寫平衡樹麼?但是,所以我們考慮用vec to rvector vector 做這個問題。插入的時候,我們只要low erbo un dlower bound ...