題解 今日頭條2018校招後端方向(第四批)

2021-08-15 10:18:32 字數 1498 閱讀 8035

原題鏈結

有乙個僅包含』a』和』b』兩種字元的字串s,長度為n,每次操作可以把乙個字元做一次轉換(把乙個』a』設定為』b』,或者把乙個』b』置成』a』);但是操作的次數有上限m,問在有限的運算元範圍內,能夠得到最大連續的相同字元的子串的長度是多少。

輸入描述:

第一行兩個整數 n , m (1<=m<=n<=50000),第二行為長度為n且只包含』a』和』b』的字串s。
輸出描述:
輸出在操作次數不超過 m 的情況下,能夠得到的 最大連續 全』a』子串或全』b』子串的長度。
示例:

8 1

aabaabaa

5

把第乙個 'b' 或者第二個 'b' 置成 'a',可得到長度為 5 的全 'a' 子串。

————————————   分界線————————————————

分析:

該字串非 a 即 b 也就是說在區間 l~r之間把所有字元變為 a 所需的步驟數是 該區間內 b 的數量。反之亦然.

用陣列 count[i] 表示 字串中位置區間 0~i 包含的 a 的個數

則 區間 l~r 的 a 的個數為 count[r]-count[l-1]

b 的個數用 a 的個數算出 即 區間 l~r 的 b 的個數為 r+1-count[r]-(l+1-1-count[l-1])=r+1-count[r]-l+count[l-1]

在區間 l~r 的 a 和 b 的個數已知的情況下

若 區間長度step內的 a 的個數 <= m 則 可以通過 m 個步驟 產生 長度為step的字串 b

若 區間長度step內的 b 的個數 <= m 則 可以通過 m 個步驟 產生 長度為step的字串 a

歸納為 :若 區間長度step內的 b 或 a 的個數 <= m 則 可以通過 m 個步驟 產生 長度為step的字串

這樣 就可以直接計算出乙個字串長度(區間長度step)是否可行,因此不需要進行遞推,可以直接進行二分搜尋,得到最大長度。

檢查乙個長度step是否可行的時間複雜度為o(n),二分搜尋的時間複雜度為o(log n)。

因此,該方法總的時間複雜度為 o(n*log n)

**:#include#include#includeusing namespace std;

int count[50005];

int n,m;

int ans=0;

//檢查當前區間長度(step)是否能在 m 個步驟內實現全 a 或 全 b

bool func(int step)

return false;}

int main(){

cin>>n>>m;

string str;

cin>>str;

//輸入並計算出 count 陣列

int sum=0;

for(int i=0;i

今日頭條2018 座標

其中 最大 是在右上方的意思,即任意一點沒有同時x,y都比它大的點。建立node節點 class node 將節點按橫座標排序,之後從後向前查詢,記錄ymax。如果當前點的y座標大於ymax,則當前點為符合題意的點。或者 預處理陣列 x 0 1 2 3 4 5 y 3 6 7 2 5 4 a 7 7...

2018今日頭條後端研發實習一面面經

自我介紹 tcp與udp的區別 http協議怎麼知道已完成資料傳送 記不清了 stl中hashmap解決衝突的方法 增大空間的方法 大檔案去重 現場程式設計筆試 撲克牌問題 當時太緊張沒想清楚,一直在找規律推結果,面試完才意識到這是一道簡單的模擬題而已。題目有已經發過部落格解析了,具體鏈結如下 第一...

今日頭條2018 筆試題2

定義兩個字串變數 s,m,再定義兩種操作,第一種操作 m ss s s 說明 s只會變為原來的2倍 第二中操作 s s m 假設s,m初始化如下 s a m s求最小的操作步驟數,可以將s拼接到長度等於n。示例1 輸入6,輸出3 示例2 輸入4,輸出2 思路 第一種操作,s變為原來的1倍 說明偶數的...