【2020.9.12SSL模拟赛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

说明

【输入输出样例说明】
符合条件的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) (16)(17)(18)(26)(27)(28)(36)(37)(38)

分析:

暴力枚举 找到 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;
}

猜你喜欢

转载自blog.csdn.net/dgssl_xhy/article/details/108550556