51Nod-1478-括号序列的最长合法子段
来源:互联网 发布:mac 退出dashboard 编辑:程序博客网 时间:2024/05/22 05:10
ACM模版
描述
题解
一拿到题,就想到了一个十分低级的做法,先正着遍历一遍,遍历过程中再倒着遍历(One),不负众望,TLE
了四组数据。
无奈,想了一下,只好使用栈来实现了,先预处理一遍,将括号匹配在一起,然后检索最长串即可(Two)。
代码
One:
// TLE//#include <stdio.h>//#include <string.h>////const int MAXN = 1e6 + 5;////char s[MAXN];////int main(int argc, const char * argv[])//{// scanf("%s", s);// // int len = (int)strlen(s);// int numA = 0, numB = 0;// int res = 0, count = 1;// for (int i = 0; i < len; i++)// {// if (s[i] == '(')// {// numA++;// }// else// {// if (numA == numB)// {// numA = numB = 0;// continue;// }// numB++;// if (numA == numB && numA + numB >= res)// {// if (res < numA + numB)// {// res = numA + numB;// count = 1;// }// else// {// count++;// }// }// else if (numA > numB && numB + numB >= res)// {// int pos = i - numB - numB;// int A = 0, B = 0;// for (int j = i; j > pos; j--)// {// if (s[j] == ')')// {// B++;// }// else// {// if (A == B)// {// break;// }// A++;// if (A == B && A + B >= res)// {// if (res < A + B)// {// res = A + B;// count = 1;// }// else// {// count++;// }// }// }// }// }// }// }// // printf("%d %d\n", res, count);// // return 0;//}
Two:
#include <iostream>#include <cstring>#include <cstdio>#include <stack>using namespace std;typedef long long ll;const int MAXN = 1e6 + 10;char s[MAXN];int vis[MAXN];int main(){ scanf("%s", s + 1); memset(vis, 0, sizeof(vis)); stack<int> sta; int l = (int)strlen(s + 1); int res = 0, tmp, count = 1; for (int i = 1; i <= l; i++) { if (s[i] == '(') { sta.push(i); } else { if (!sta.empty()) { vis[i] = 1; vis[sta.top()] = 1; sta.pop(); } } } tmp = res = 0; for (int i = 1; i <= l; i++) { if (vis[i]) { tmp++; } else { tmp = 0; } if (tmp == res && res) { count++; } else if (tmp > res) { count = 1, res = tmp; } } cout << res << " " << count << endl; return 0;}
0 0
- 51nod 1478 括号序列的最长合法子段
- 51Nod-1478-括号序列的最长合法子段
- 51nod-1478 括号序列的最长合法子段
- 51nod 1478 括号序列的最长合法子段
- 51nod 1478 括号序列的最长合法子段 (括号匹配)
- 51nod 1478-括号序列的最长合法子段(模拟)
- 51nod 1478 括号序列的最长合法子段(栈-括号匹配寻找最长合法子串长度及其个数)
- 括号序列的最长合法子段
- 51nod 1478 括号序列的最长合法子段【思维+前缀和+优先队列】好题!
- 1478 括号序列的最长合法子段
- 1478 括号序列的最长合法子段
- 栈+括号配对 51Nod1478 括号序列的最长合法子段
- 51nod 合法括号子段
- 51Nod-1791-合法括号子段
- 51nod 1791 合法括号子段
- 合法括号子段 51Nod
- 合法括号子段 51Nod
- 51NOD 1791 合法括号子段
- BigDecimal用法详解
- Java基础知识总结(绝对经典)
- odoo9.0---ORM API
- 空闲时间学一个Linux命令(3)——pwd命令
- 美团数据库运维自动化系统构建之路
- 51Nod-1478-括号序列的最长合法子段
- Mysql下GROUP_CONCAT使用
- Ubuntu 16.04[64bit]嵌入式交叉编译环境arm-linux-gcc搭建过程图解
- Android Studio 2.2 新功能详解
- Map根据value进行排序
- Linux下Redis的详细安装与配置
- 微信小程序破解IDE+DEMO
- SC2Rank 星际2天梯排行榜 SpringMVC + Spring + Mybatis + Mysql + Maven java web项目
- CFNetwork编程指南(一)——CFNetwork概念(CFNetwork Concepts)