原題鏈結
有乙個僅包含』a』和』b』兩種字元的字串s,長度為n,每次操作可以把乙個字元做一次轉換(把乙個』a』設定為』b』,或者把乙個』b』置成』a』);但是操作的次數有上限m,問在有限的運算元範圍內,能夠得到最大連續的相同字元的子串的長度是多少。
輸入描述:
第一行兩個整數 n , m (1<=m<=n<=50000),第二行為長度為n且只包含』a』和』b』的字串s。輸出描述:
輸出在操作次數不超過 m 的情況下,能夠得到的 最大連續 全』a』子串或全』b』子串的長度。示例:
8 1aabaabaa
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倍 說明偶數的...