hdoj 5479 Scaena Felix 【Stack】

来源:互联网 发布:软件登记证书 编辑:程序博客网 时间:2024/05/21 04:26

题目链接:hdoj 5479 Scaena Felix

Scaena Felix

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 763 Accepted Submission(s): 325

Problem Description
Given a parentheses sequence consist of ‘(’ and ‘)’, a modify can filp a parentheses, changing ‘(’ to ‘)’ or ‘)’ to ‘(‘.

If we want every not empty substring of this parentheses sequence not to be “paren-matching”, how many times at least to modify this parentheses sequence?

For example, “()”,”(())”,”()()” are “paren-matching” strings, but “((“, “)(“, “((()” are not.

Input
The first line of the input is a integer T, meaning that there are T test cases.

Every test cases contains a parentheses sequence S only consists of ‘(’ and ‘)’.

1≤|S|≤1,000.

Output
For every test case output the least number of modification.

Sample Input
3
()
((((
(())

Sample Output
1
0
2

题意:就是求匹配括号数目

AC代码:

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <queue>#include <cmath>#include <stack>#define fi first#define se second#define ll o<<1#define rr o<<1|1#define CLR(a, b) memset(a, (b), sizeof(a))using namespace std;typedef long long LL;typedef pair<int, int> pii;const int MOD = 1e9 + 7;const int MAXN = 2*1e5 + 10;void add(LL &x, LL y) { x += y; x %= MOD; }char str[1010];int main(){    int t; scanf("%d", &t);    while(t--) {        scanf("%s", str);        int len = strlen(str); int ans = 0;        stack<int> S;        for(int i = 0; i < len; i++) {            if(str[i] == '(') {                S.push(1);            }            else {                if(!S.empty()) {                    ans++;                    S.pop();                }            }        }        printf("%d\n", ans);    }    return 0;}
0 0