标签:stdin 括号 com win pre 插入 end == names
https://www.acwing.com/problem/content/152/
思路:开一个pair栈,第一个元素存字符的种类,第二个元素存“这个字符之后曾经匹配过的最大长度”。
为什么是“这个字符之后”,我也很难说清楚,但是感觉这样是对的。某一次遇到右括号弹栈之后,顺便把栈顶的最大长度也update了。
一开始插入一个虚拟节点就不需要判空了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char ss[100005];
stack<pair<char, int> > s;
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
int sum = 0;
scanf("%s", ss);
int n = strlen(ss);
s.push({'#', 0});
for(int i = 0; i < n; ++i) {
if(ss[i] == ')') {
if(s.top().first == '(') {
int tmp = s.top().second;
s.pop();
char c2 = s.top().first;
int tmp2 = s.top().second;
s.pop();
s.push({c2, tmp2 + tmp + 2});
sum = max(sum, tmp2 + tmp + 2);
} else {
s.push({ss[i], 0});
}
} else if(ss[i] == ']') {
if(s.top().first == '[') {
int tmp = s.top().second;
s.pop();
char c2 = s.top().first;
int tmp2 = s.top().second;
s.pop();
s.push({c2, tmp2 + tmp + 2});
sum = max(sum, tmp2 + tmp + 2);
} else {
s.push({ss[i], 0});
}
} else if(ss[i] == '}') {
if(s.top().first == '{') {
int tmp = s.top().second;
s.pop();
char c2 = s.top().first;
int tmp2 = s.top().second;
s.pop();
s.push({c2, tmp2 + tmp + 2});
sum = max(sum, tmp2 + tmp + 2);
} else {
s.push({ss[i], 0});
}
} else {
s.push({ss[i], 0});
}
}
printf("%d\n", sum);
}
标签:stdin 括号 com win pre 插入 end == names
原文地址:https://www.cnblogs.com/Inko/p/11423111.html