oj:http://oj.cust.edu.cn/problem/72/
阅读完这篇文章,请问题中有几对括号?(划掉 这才不是题目叻
现给出一篇文章,其中的字符全由字母、数字、小括号、空格、换行符及字符[?!.,-";:]组成。
求文章中出现了几对匹配的括号。
注:左括号与右括号匹配称为一对括号,若两左右括号中出现空格、字符[?!.,-";:]或跨行,则为不匹配
例(此处中文字符应替换为英文,请自行理解):
【两对匹配】((啊啊啊啊啊啊啊啊啊))
【匹配】(我还没见过其它提供此功能的oj)
【不匹配】(待答主升级后也许会更新
【不匹配】(百毒谷狗 是最好的老师)
【不匹配】
这时候比赛大概可以刷掉一小半的题目,混到部分比赛的衣服了(开心。
又过了一段时间之后),已经达到分分钟切水题的境界了
【不匹配】学习计算思维和(编程技巧。包括C++的STL库)
若干行字符串,每行字符串仅由字母、数字、小括号、空格及字符[?!.,-";:]组成
字符串总长度不超过300000
括号配对的数量
Lorem ipsum dolor sit amet, consectetur adipisicing elit, (sed) do eiusmod tempor incididunt ut lab(ore) (et dolore) magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo con(sequat. Du)is aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla (paria)tur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est (labor)um.
4
这道题比较玄学、、、、、、一开始布尔数组的长度设的100000没过,1000000就过了,但是测试数据连个上w的也没有啊!不是很明白。
大概想法就是记录前括号,找到后括号去匹配。匹配成功待配前括号--。遇到炸弹(不该出现的字符)就把整个记录清空,
上代码
#include <stdio.h>
#include<string.h>
using namespace std;
int main(){
char a;
char b[14]={'[','?','!','.',',','-','"',';',':',']',' ','\n'};
int total=0;
int fc=0;
bool flag[100000]={false};
while(scanf("%c",&a)==1){
if(a=='('){
flag[fc]=true;
fc++;
}
if(fc>0&&a==')'&&flag[fc-1]==true){
flag[fc-1]=false;
fc--;
total++;
}
if(a==b[0]||a==b[1]||a==b[2]||a==b[3]||a==b[4]||a==b[5]||a==b[6]||a==b[7]||a==b[8]||a==b[9]||a==b[10]||a==b[11]){
for(int i=0;i<fc;i++){
flag[i]=false;
}
}
}
printf("%d",total);
return 0;
}