Orz教主 bjfu1151 字符串操作

本篇介绍了一种算法挑战,目标是计算并消除特定字符串“Orz”在一个由O、r、z字符组成的序列中出现的次数。通过使用栈数据结构,实现了一个高效的算法解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

众所周知,楼教主经常一个人单挑一个队,令世界各地的ACMer闻风丧胆。久而久之,Orz教主成为了ACM界的一种文化。现在,几乎每所学校都拥有他们的教主,而且教主总是被Orz。
有一天,某教主收到了一封信。这封信有点特别,因为信中的内容是由O、r、z这三个字母按照不固定的顺序组成的。
教主都喜欢显得自己很弱,所以他不希望在信中看到连续的Orz三个字母,他决定把它们都消掉。
教主每次都找到最左边的一个Orz,找到之后就把它消去,并且把后面的内容与前面的内容合并,接着继续找Orz。
例如这封信的内容为:
OrzOrzOOrzOOOrzrzr
那么,教主依次消去最左边的Orz,这封信依次变为:
OrzOOrzOOOrzrzr
OOrzOOOrzrzr
OOOOrzrzr
OOOrzr
OOr
这样,这封信的内容就不再含有Orz了。
教主想知道,他一共能够消去多少个Orz。在上面的例子中,他一共能消去5个。

输入

输入数据包括两行。
第一行为一个正整数n(0<n<1000000),表示这封信含有的字母个数。
第二行为n个字符,每一个字符仅有可能是O,r,z中的一个,表示这封信的内容(注意O为大写字母,r和z为小写字母)。

输出

输出仅一行,为一个正整数s,表示教主能够消去的Orz个数。

样例输入

18
OrzOrzOOrzOOOrzrzr

样例输出

5

#include <iostream>
#include <stack>
using namespace std;
#define MAX 1000005
char letter[MAX];
stack<int> line;

int main(){
	int n,i,t,count=0;
	scanf("%d",&n);
	scanf("%s",letter);
	for (i=0;i<n;i++){
		if (line.empty()){
			line.push(letter[i]);
			continue;
		}
		t=line.top();
		line.pop();
		if (line.empty()){
			line.push(t);
			line.push(letter[i]);
			continue;
		}
		if (line.top()=='O'&&t=='r'&&letter[i]=='z'){
			line.pop();
			count++;
			continue;
		}
		line.push(t);
		line.push(letter[i]);
	}
	printf("%d\n",count);
	return 0;
}

其实这是个好水的题,只不过容易超时。

…… 多年之后终于过了这道题,不容易。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值