题意

一串括号字符串,里面存在一些‘?’,其中‘?’既可以当作 '(' 又可以当作 ')' ,计算有多少对(l,r),在s中[sl,s(l+1),s(l+2),.....sr],内的括号是匹配的。n=strlen(s)<=5000。

分析

这个题还是卡了很久的,我果然是很菜的。

错误思路
一开始的时候想,用一个变量cur表示还未匹配的左括号 '(' ,用变量num记录‘?’的数量,‘?’尽量当右括号使用,在判断(l,r)是否匹配的时候从左往右扫,遇到'(' 的时候cur++,遇到 ')'cur--,如果最左边的字符是'?'那么直接将其变成'('  num--,cur++;因为它如果是')'不再有作用。当cur==num的时候说明当前长度是匹配的。如果num>cur,且(num-cur)%2==0则说明问好可以和‘(’匹配,剩下的‘?’自己互相匹配。

错误代码

 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=+;
char s[maxn];
int n;
int main(){
scanf("%s",s);
n=strlen(s);
int ans=;
for(int i=;i<n;i++){
int cur=,num=;
if(s[i]==')')continue;
else cur++;
for(int j=i+;j<n;j++){
bool jud=;
if(s[j]=='(')cur++;
if(s[j]==')')cur--;
if(s[j]=='?')num++;
if(cur==&&num==)jud=;
else if(cur==&&num){cur++;num--;}
if(cur==num)jud=;
else if(num>cur&&(num-cur)%==)jud=;
if(jud)ans++;
}
}
cout<<ans<<endl;
return ;
}

思路纠正:

上面一开始我考虑最左边的'?'只能被当作(使用,可以在深入考虑一下,如果当前?的数量大于(的数量,那么多的?就只能被当作(使用否则没法匹配。这样可以消除对于右边的影响 "(??(()"也就是‘?’当作‘)’来匹配左边的‘(’。

正确代码:

 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=+;
char s[maxn];
int n;
int main(){
scanf("%s",s);
n=strlen(s);
int ans=;
for(int i=;i<n;i++){
int cur=,num=;
if(s[i]==')')continue;
else cur++;
for(int j=i+;j<n;j++){
bool jud=;
if(s[j]=='(')cur++;
if(s[j]==')')cur--;
if(s[j]=='?')num++;
if(cur==&&num==)jud=;
else if(cur==&&num){cur++;num--;}
if(cur==num)jud=;
else if(num>cur&&(num-cur)%==)jud=;
if(jud)ans++;
}
}
cout<<ans<<endl;
return ;
}

最新文章

  1. 分布式之Zookeeper使用
  2. Mac OS X 10.10 Yosemite下面解决XAMPP无法开启mysql的问题
  3. Socket Programming in C#--Introduction
  4. 用css做类似表格的布局
  5. Android 屏蔽ScrollView滑动操作
  6. 安装ecshop提示“安装数据失败”或者“创建管理员帐号”
  7. Sublime编辑器的使用
  8. 微信小程序地图控件篇 ---自定义图标被地图覆盖的问题
  9. restful规范简要概述
  10. CRMEB客户管理+电商管理系统帮助文档,送给有需要的人
  11. 第三方jar上传至公司maven仓库(私库)解决办法
  12. _pvp_killed_loot
  13. C语言 &#183; 数组输出
  14. bugfree 数据库配置 显示No such file or directory
  15. Elasticsearch 常用基本查询
  16. bzoj3629 / P4397 [JLOI2014]聪明的燕姿
  17. git分支管理图
  18. Bzoj2152/洛谷P2634 聪聪可可(点分治)
  19. 《C++ Primer Plus》第8章 函数探幽 学习笔记
  20. img图片加载失败默认图片

热门文章

  1. asp.net viewstate 数据过大 导致错误
  2. 演示使用Metasploit入侵Android
  3. Navicat for MySQL导入.sql文件
  4. Fragment详解及举例
  5. HTML标签01
  6. ACM学习历程—计蒜客15 单独的数字(位运算)
  7. 学习动态性能表(4)--v$sqltext&amp;v$sqlarea
  8. android中asynctask的使用实例
  9. c#实现QQ群成员列表导出及邮件群发之模拟QQ登陆
  10. mysql权限验证流程