洛谷P2697 寶石串

2022-07-10 06:48:13 字數 1394 閱讀 2892

題目鏈結

題目大意

給乙個只有 \(\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 ...