牛客網 苦逼的單身狗 尺取法

2022-06-04 04:18:06 字數 1334 閱讀 8063

題目鏈結

題意 :小z決定向女神表白,但性格靦腆的小z決定隱晦一點,擷取一段包含'l'、'o'、'v'、'e'的英文。(順序不限)小z想起之前小d送給他一本英文書,決定在這裡面擷取一段話,小z發現有好多種方案來擷取這段話。你能知道小z能有多少種方案擷取這段話麼?為了簡化問題,英文文字講不會出現空格、換行、標點符號及只有大寫的情況。

分析 :最原始的想法有兩個,乙個是粗暴地列舉所有大於等於四的子區間判斷是否滿足條件最後計算貢獻,另乙個就是列舉左端點 l,假設使得其包含 "love" 的第乙個右端點為 r,那麼以這個「左端點的貢獻」就是 len - r ( len 是主串長度 ),這樣做就避免了列舉到重複的部分且降低了第一種做法的複雜度,但是依舊過不了這題。現在就來優化第二種做法,假設當前有乙個子區間( l, r ) 是符合條件的則其貢獻為 len - r ,那麼列舉下乙個的時候即 l + 1,對於這個左端點我們會發現符合條件的右端點( 令為 r' )肯定大於或等於 r 即 r' ≥ r,為什麼? 首先想到一點!如果當前使得左端點 l 滿足條件的最左右端點是 r ,也就是說加上了 r 才使得 ( l, r ) 滿足條件,即 r 這個位置必定是 "love" 的其中乙個,那麼對於 l + 1 來說其區間元素相較 l 少了 l 這個位置的字元元素,而即使多了乙個字元元素的 l 都要列舉到 r 才能使得 ( l, r ) 滿足條件,那使 l + 1 滿足條件的右端點 r' 必定是滿足 r' ≥ r 的,故尺取法可行!

#includeusing

namespace

std;

const

int maxn = 1e5 + 10

;int num[4

];char

s[maxn];

int which(char

ch)bool

isok()

int main(void

)

int now = 0

;

intl, r;

long

long

ans;

l = r = 0

; ans = 0

; memset(num,

0, sizeof

(num));

int idx =which(s[l]);

if(idx!=-1) num[idx]++, now++;

while(l <= r && r

else

}printf(

"%lld\n

", ans);

}return0;

}

view code

苦逼的單身狗

題目描述 雙11又到了,小z依然只是乙隻單身狗,對此他是如此的苦惱又無可奈何。為了在這一天脫單小z決定向女神表白,但性格靦腆的小z決定隱晦一點,擷取一段包含 l o v e 的英文。順序不限 小z想起之前小d送給他一本英文書,決定在這裡面擷取一段話,小z發現有好多種方案來擷取這段話。你能知道小z能有...

B 苦逼的單身狗

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 雙11又到了,小z依然只是乙隻單身狗,對此他是如此的苦惱又無可奈何。為了在這一天脫單小z決定向女神表白,但性格靦腆的小z決定隱晦一點,擷取一段包含 l o v e 的英...

苦逼的單身狗 啥也不會的小白

題目鏈結 雙11又到了,小z依然只是乙隻單身狗,對此他是如此的苦惱又無可奈何。為了在這一天脫單小z決定向女神表白,但性格靦腆的小z決定隱晦一點,擷取一段包含 l o v e 的英文。順序不限 小z想起之前小d送給他一本英文書,決定在這裡面擷取一段話,小z發現有好多種方案來擷取這段話。你能知道小z能有...