天天看點

【9.12模拟賽T1】字元串【字元模拟】

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對 ( 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;
}