1137.字串
時間限制:1000MS
記憶體限制:128000KB
題目描述
小熊有一個由小寫英文字母組成的字串s = s1s2...sn,小熊想要計算s中有多少子串包含字串“bear”,也就是找出滿足字串x(i, j)= sisi+1…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,
請幫助小熊解決這個問題,
輸入
輸入共1行,包含一個非空字串s,資料保證字串s中只包含小寫英文字母,
輸出
輸出共1行,包含一個整數,表示這個問題的答案,
輸入樣例
bebearar
輸出樣例
9
說明
【輸入輸出樣例說明】
符合條件的9對
(
i
,
j
)
(i, j)
(i,j)為:
(
1
,
6
)
,
(
1
,
7
)
,
(
1
,
8
)
,
(
2
,
6
)
,
(
2
,
7
)
,
(
2
,
8
)
,
(
3
,
6
)
,
(
3
,
7
)
,
(
3
,
8
)
(1,6),(1,7),(1,8),(2,6),(2,7),(2,8),(3,6),(3,7),(3,8)
(1,6),(1,7),(1,8),(2,6),(2,7),(2,8),(3,6),(3,7),(3,8),
分析:
暴力列舉 找到 i i i之后第一個出現" b e a r bear bear"的位置 再更新答案
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,x[3005],y[3005],ans,qaq;
string qwq;
int main(){
cin>>qwq;
for(int i=0;i<qwq.length()-3;i++)
{
if(qwq[i]=='b'&&qwq[i+1]=='e'&&qwq[i+2]=='a'&& qwq[i+3]=='r')
{
qaq++; //統計bear個數
x[qaq]=i;y[qaq]=i+3; //記錄b和r
}
}
for(int i=0;i<qwq.length()-3;i++)
for(int j=i+3;j<qwq.length();j++)
for(int k=1;k<=qaq;k++)
if(i<=x[k]&&j>=y[k]) //列舉的子串在范圍內
{
ans++;break;
}
printf("%d",ans);
return 0;
}
方法2:
判斷當前是否組成" b e a r bear bear" 再累加 r r r右邊的字母個數
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
string qwq;
int ans;
bool ovo(int l,int r) //判斷bear
{
int p=0;
for(int i=l;i<=r-3;i++)
if(qwq[i]=='b'&&qwq[i+1]=='e'&&qwq[i+2]=='a'&& qwq[i+3]=='r')
{
p=1; //不能直接return 1
ans++; //自身也算子串
break;
}
return p;
}
int main()
{
ios::sync_with_stdio(false);
cin>>qwq;
for(int i=0;i<qwq.length()-3;i++)
for(int j=i+3;j<qwq.length();j++)
if(ovo(i,j))
{
ans+=qwq.length()-1-j; //累加右段
break;
}
printf("%d",ans);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/23855.html
標籤:其他
上一篇:在類的內部創建該類的物件
