QDUOJ 河老師的新年禮物(尺取法)

2022-05-06 05:24:08 字數 1529 閱讀 1785

描述

河老師的新年禮物是乙個長度為n的ab串,他想要找出最長的乙個子串使得這個子串中每個字元都相等,他稱之為「最優子串」。當然對河老師來說這個問題太簡單了,於是他加了乙個條件:他可以改變這個串中的某些字元,但一次只能改變乙個字元,最多能改變k次。河老師想要知道,在可以對串進行改變的前提下,這個ab串的「最優子串」的長度是多少。

輸入第一行是乙個整數t,代表t組測試資料,

第二行是兩個整數 n , k (1 ≤ n ≤ 100 000, 0 ≤ k ≤ n) 

第三乙個ab串,長度為n

輸出輸出「最優子串」的長度

樣例輸入1

複製

2

4 2abba

8 1aabaabaa

樣例輸出1

4

5

檢視隱藏資訊

給你一串字串和k個修改字串的機會,讓這個字串獲得最長連續相同子串

題解:所謂尺取法,顧名思義,就是一把尺子(固定某一條件),不斷向右(向左)移動,不斷更新我們要的答案。在這裡,我們只要從左往右,讓修改的字元個數從0慢慢增加到k,中途將字元改成同乙個字元(a改成b或者b改成a都行),最後修改字元數固定為k,每次向右移動時,如果字串需要修改,那就改掉右面的字元,將之前最左邊的字元換回來。那麼我們可以用乙個佇列去實現。

如果你看不懂上面也沒關係,我再講具體一些。我們從左邊開始,掃瞄字串。如果遇到a,那就把a丟進佇列,如果遇到b,且此時佇列中b的個數不超過k的話,就把b丟進去。如果b的個數等於k,且又遇到乙個b,那就記錄下此時佇列長度,這個時候佇列裡k個b可以當作a,所以可以記錄佇列元素個數,更新答案最大值。之後將佇列前面元素彈出,直到彈出乙個b,再將新的b壓進佇列……一直掃瞄直到字串尾。

接下來將a和b互換,重複上面步驟,更新最大值。最後輸出最大值。

第一次寫的佇列是訪問了修改字元的下標,更新最大值為當前下標與彈出下標的差。在codeforces上能過,qduoj就wa,這種方法效率會比上面的高一些,畢竟佇列裡存入的只是部分值,還特地考慮了k=0的情況,應該還是資料(shui)的問題吧》_<

#include#include

#include

using

namespace

std;

intmain()

if(s[i-1]=='b'

) }

if(q.size()>maxa) maxa=q.size();

}while

(q.size()) q.pop();

maxb=0;c=0

;

for(i=1;i<=n;i++)

if(s[i-1]=='a'

) }

if(q.size()>maxb) maxb=q.size();

}if(maxa>maxb) max=maxa;

else max=maxb;

printf(

"%d\n

",max);

}return0;

}

給大家的新年禮物

感冒持續中,睡到下午才起來,也沒什麼安排,所謂2007年的最後一天,大概也就這樣過去了吧。雖然從理論上來說,每一分 每一秒長度相等,今年和去年 今年和明年並未有何不同,但是我真的覺得,我們的時間,也有重力加速度。生命中的頭乙個十年,因為懵懂而格外漫長,大部分時間都在睡覺。到了第二個十年,日子被學習劃...

mxj的新年禮物 貪心

題目背景 在新的一年,mxj給俱樂部的孩子們準備了一堆的禮物,它生成了乙個隨機數列表aa,使得第i個人會得到a i 件禮物。但是,因為某些人得到的禮物太多,為了公平起見,mxj建議大家把禮物平均分配。題目描述 大家圍成了乙個圈,每個人可以向他左邊或者右邊的人傳遞禮物,問,至少傳遞多少件禮物,才能讓每...

送給自己2023年的新年禮物

從乙個多月前就想給自己乙份新年禮物,並開始逐步去製作,可是一直拖著,沒有完成。而且不想把禮物年後再送給自己,所以熬到深夜,終於在大年二十九凌晨2點把它給做好了 當然有待改善 禮物被我命名為 computercontroltime 主要由computercontroltime軟體 由vb編寫 微控制器...