描述
众所周知,楼教主经常一个人单挑一个队,令世界各地的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;
}
其实这是个好水的题,只不过容易超时。
…… 多年之后终于过了这道题,不容易。。