1. 程式人生 > >【題解】字符串

【題解】字符串

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; }
參考程序

【題解】字符串