計蒜客 非常男女 1853

2021-10-04 08:34:05 字數 1187 閱讀 2203

近來,蒜頭君致力於研究班上同學的配對問題(別想太多,僅是舞伴),通過各種推理和實驗,他掌握了大量的實戰經驗。例如,據他觀察,身高相近的人似乎比較合得來。

萬聖節來臨之際,蒜頭君準備在學校策劃一次大型的「非常男女」配對活動。對於這次活動的參與者,蒜頭君有自己獨特的選擇方式。他希望能選擇男女人數相等且身高都很接近的一些人。這種選擇方式實現起來很簡單。他讓學校的所有人按照身高排成一排,然後從中選出連續的若干個人,使得這些人中男女人數相等。為了使活動更熱鬧,蒜頭君當然希望他能選出的人越多越好。請編寫程式告訴他,他最多可以選出多少人來。

輸入格式

第一行有乙個正整數 n\ (1\le n \le 10^5)n (1≤n≤10

5),代表學校的人數。

第二行有 nn 個用空格隔開的數,這些數只能是 00 或 11,其中,00 代表乙個女生,11代表乙個男生。

輸出格式

輸出乙個非負整數,這個數表示在輸入資料中最長的一段男女人數相等的連續子串行長度。

輸出時每行末尾的多餘空格,不影響答案正確性

樣例輸入複製

90 1 0 0 0 1 1 0 0

樣例輸出複製

6本題需要使用一些技巧,在這裡,我們利用字首和的原理,通過將0轉為-1,可以更好記錄字首和,如果乙個區間內的和為0,表示此事男生和女生的數量相等,所以我們可以利用乙個標記陣列來標記此字首第一次出現的位置,在第二次碰到時,就可以更新ans值

//@authore:hairu,wu

//@from,ahut

#include

#include

#include

using

namespace std;

intmain()

for(i=

1;i<=n;i++

)// map[j] 記錄j這個字首和出現的最早位置

//如果字首和出現過,更新ans值。

if(map[sum[i]

+n]&& ans+n])

ans=i-map[sum[i]

+n];

//如果這個和沒有出現過,就記錄當前第一次出現的位置

if(map[sum[i]

+n]==

0) map[sum[i]

+n]=i;}

cout

}

計蒜客T1583 非常男女

近來,蒜頭君致力於研究班上同學的配對問題 別想太多,僅是舞伴 通過各種推理和實驗,他掌握了大量的實戰經驗。例如,據他觀察,身高相近的人似乎比較合得來。萬聖節來臨之際,蒜頭君準備在學校策劃一次大型的 非常男女 配對活動。對於這次活動的參與者,蒜頭君有自己獨特的選擇方式。他希望能選擇男女人數相等且身高都...

計蒜客 2019計蒜之道D

題意 現在給定你乙個字串 s ss 以及乙個整數 k kk,請求出 s ss的字典序最小的長度為 k kk的子串行。資料範圍 0 s 5000000 00 s 5000 000 樣例輸入 helloworld 5樣例輸出 ellld思路 假如我們先不考慮長度為k的限制我們應當怎麼做?我們以樣例為例子...

計蒜客 解碼

蒜頭君自己發明了一種字串的編碼方式,對於只含有大小寫字母的字串,可以用數字來表示括號裡面的串連續出現的次數 數字有可能超過一位數 比如a abcd 2等價於aabcdabcd。特別地,如果數字前面沒有括號,表示緊貼數字的前面的 乙個字母 出現的次數。比如abc2表示abcc。為了降低解碼的難度,蒜頭...