【題解】字符串
阿新 • • 發佈:2019-05-03
pan 數據 技術 描述 開始 turn strong spa ide
題目描述
小熊有一個由小寫英文字母組成的字符串s=s1s2...sn。小熊想要計算s中有多少子串包含字符串“bear”,也就是找出滿足字符串x(i,j)=si......sj包含至少一個字符串“bear”的(i,j)對數(1≤i≤j≤n)。
字符串x(i,j)包含字符串“bear”定義為存在一個整數k(i≤k≤j-3),滿足sk=b,sk+1=e,sk+2=a,sk+3=r。
請幫助小熊解決這個問題。
輸入格式
一行,包含一個非空字符串s。數據保證字符串s中只包含小寫英文字母。
輸出格式
一行,包含一個整數,表示這個問題的答案。
輸入樣例
bebearar
輸出樣例
9
樣例說明
符合條件的9對(i,j)分別是:(1,6),(1,7),(1,8),(1,6),(2,7),(2,8),(3,6),(3,7),(3,8)。
數據規模
對於50%的數據:1≤n≤200。
對於100%的數據:1≤n≤3000。
題解
容易想到,我們設$size$為字符串長度,那麽字符串的$[i,size)$($i$從$0$開始)中包含"bear"的以第$i$位開頭的序列數量為$size - lt - 3$,其中$lt$為離$i$最近的"bear"的位置。我們從後往前枚舉$i$,順便更新$lt$即可。(其實這也算是尺取法吧)
#include <iostream> #include <string> using namespace std; string str; int ans; int main() { cin >> str; int lt = str.size() - 3; for(register int i = str.size() - 4; i >= 0; --i) { if(str[i] == ‘b‘ && str[i + 1] == ‘e‘ && str[i + 2參考程序] == ‘a‘ && str[i + 3] == ‘r‘) lt = i; ans += str.size() - lt - 3; } cout << ans; return 0; }
【題解】字符串