Red Red Red - 双指针

Red Red Red!!!

题目背景

Red(Yes); Purple(No).

题目描述

小红拿到了一个长度为 n 的字符串,该字符串仅由大写字母组成。
她想取一个子串,该子串包含至少 a 个 'R' 字符,至多 b 个 'P' 字符。
你能告诉她有多少合法的方案可以取到吗?


注意:
1.子串定义见 英文wiki-substring 或 中文wiki-子串
例如:"an" 是 "ant" 的子串而 "at" 不是。
2.只要子串的起始位置或终止位置不同,我们就认为是两个不同的方案。

输入格式

第一行三个正整数 n, a 和 b ,用空格隔开。
第二行一行字符串,该字符串保证仅包含大写字母('A'到'Z')。
数据范围:

 

输出格式

取一个子串,包含至少 a 个 'R' 字符,至多 b 个 'P' 字符的方案数。

输入输出样例

输入 #1

13 3 0
RRRPBRRRDBRPR

输出 #1

10

输入 #2

5 1 1
RARPR

输出 #2

13

 

说明/提示

样例一解释:
共有 10 个合法的子串选择方式。假设下标是从 0 到 12 ,那么 10 个合法串分别是:
s[0,2] = "RRR"
s[4,7] = "BRRR"
s[4,8] = "BRRRD"
s[4,9] = "BRRRDB"
s[4,10] = "BRRRDBR"
s[5,7] = "RRR"
s[5,8] = "RRRD"
s[5,9] = "RRRDB"
s[5,10] = "RRRDBR"
s[6,10] = "RRDBR"
这些串均含有至少 3 个字符 'R',且含有至多 0 个字符 'P'


题解:预处理前缀和,双指针,第二个指针动的时候要二分(可以直接upper_bound)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mo = 1e3;
ll ans = 0;
string s;
int cntr = 0, cntp = 0;
int n, a, b, rr[2000200], pp[2000200];
int main()
{
	ios::sync_with_stdio(false);

	cin >> n >> a >> b;
	cin >> s;
	for (int i = 0; i < n; i++)
	{
		if (s[i] == 'R')
		{
			cntr++;
		}
		rr[i + 1] = cntr;
		if (s[i] == 'P')
		{
			cntp++;
		}
		pp[i + 1] = cntp;
	}
	int j = 1;
	for (int i = 1; i <= n; i++)
	{
		while (rr[j] - rr[i - 1] < a && j < n )
		{
			j++;
		}
		int flg = j;
	//	cout<<"ij= "<<i<<" "<<j<<endl; 
		if (rr[j] - rr[i - 1] >= a)
		{
			int k = upper_bound(pp + 1, pp + n+1, pp[i - 1] + b) - pp-1; //j的位置
		//	cout<<"k= "<<k<<endl;
			if (k > n)k = n;
			int an = k - flg + 1;
			an=max(an,0);
			ans+=an;
			/*   这样做会超时,所以要二分(upper_bound)一下
			while (pp[j] - pp[i - 1] <= b && j <= n)
			{
				ans++;
				j++;
			}*/
		}
		j = max(flg, i + 1);
	}
	cout << ans;
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Node-RED 是一个用于构建可视化流程应用的开源工具。它可以帮助您快速构建自动化流程,并且可以通过 Web 界面操作。 要使用 Node-RED 创建一个网页,您可以按照以下步骤进行操作: 1. 安装 Node-RED:首先,您需要安装 Node-RED。您可以在 https://nodered.org/docs/getting-started/installation 上找到安装说明。 2. 启动 Node-RED:在安装完成后,打开命令行窗口,输入 `node-red` 命令并回车,就可以启动 Node-RED。 3. 在浏览器中打开 Node-RED 界面:在启动 Node-RED 后,您可以在浏览器中输入 http://localhost:1880/ 打开 Node-RED 界面。 4. 创建流程:在 Node-RED 界面中,您可以通过拖拽节点并连接它们来创建流程。 5. 配置节点:在创建流程的过程中,您需要配置每个节点的属性,以指定它们的功能。 6. 部署流程:当您完成流程设计后,点击界面上的“部署”按钮,就可以将流程部署到 Node-RED 中。 7. 在浏览器中查看网页:最后,您可以在浏览器中输入 http://localhost:1880/ 并查看 ### 回答2: Node-RED是一个基于Node.js开发的编程工具,主要用于快速搭建物联网应用的流程。要使用Node-RED来做一个网页,需要经过以下的步骤: 1. 安装Node-RED:首先,需要在计算机上安装Node.js。然后,在命令行中运行`npm install -g node-red`命令,即可安装Node-RED。 2. 启动Node-RED:在命令行中输入`node-red`命令,启动Node-RED。然后,在浏览器中输入`http://localhost:1880`,即可打开Node-RED的编辑界面。 3. 创建网页:在Node-RED编辑界面中,可以通过拖拽不同的节点来创建一个网页。例如,可以使用`http in`节点作为网页的入口,使用`http response`节点作为网页的返回数据。还可以使用其他节点,如`template`节点来定义网页的内容。 4. 配置节点:在创建节点之后,还需要对节点进行配置。例如,在`http in`节点中,需要设置网页的路径和请求方法。在`http response`节点中,需要设置返回的HTML内容。 5. 运行网页:在完成网页的创建和配置后,可以点击页面右上角的“部署”按钮,将网页运行起来。然后,在浏览器中输入相应的地址,即可访问该网页。 需要注意的是,Node-RED的编程方式是基于流程的,每个节点代表一个功能模块,通过连接不同的节点来完成复杂的处理逻辑。因此,在使用Node-RED做网页时,需要先了解其基本的流程编程概念和节点使用方法。 ### 回答3: 用Node-RED创建一个网页是非常简单的。Node-RED是一个基于流程的编程工具,它可以帮助我们通过连接预先定义的节点来构建应用程序。以下是创建一个简单网页的步骤: 1. 首先,确保已经安装了Node.js和Node-RED。在终端或命令提示符中运行以下命令来检查Node.js和Node-RED的安装情况: ``` node -v npm -v ``` 如果没有安装,请先安装Node.js和Node-RED。 2. 启动Node-RED。在终端或命令提示符中运行以下命令: ``` node-red ``` Node-RED将在本地主机的默认端口(一般是1880)上运行。 3. 打开你的Web浏览器,输入`http://localhost:1880`。这将打开Node-RED的用户界面。在这里,你可以看到一个以“流”为中心的编程环境。 4. 在左侧面板中,选择一个`http in`节点并将其拖放到流程编辑器中。 5. 右键单击`http in`节点并选择"Edit"。在弹出的对话框中,设置`URL`,例如`/my-page`,然后点击"Done"保存配置。 6. 在左侧面板中,选择一个`http response`节点并将其拖放到`http in`节点的下方。 7. 右键单击`http response`节点并选择"Edit"。在弹出的对话框中,设置响应的`Status Code`和`Headers`应答头,然后点击"Done"保存配置。 8. 连接`http in`和`http response`节点。将鼠标指针悬停在`http in`节点上,点击鼠标左键并保持点击不放,然后将指针移到`http response`节点上,松开鼠标左键。 9. 点击右上角的"Deploy"按钮以将更改应用到Node-RED运行环境。 10. 现在,你可以通过在浏览器中输入`http://localhost:1880/my-page`来访问你的网页。你将看到由`http response`节点返回的响应。 这只是一个简单的示例,你可以根据自己的需求添加更多的节点和逻辑来构建复杂的网页。Node-RED提供了丰富的节点库,可以用于创建各种不同类型的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值