Scaena Felix
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 105 Accepted Submission(s): 52
Total Submission(s): 105 Accepted Submission(s): 52
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 <b>substring</b> 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.
If we want every not empty <b>substring</b> 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 .
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
Source
BestCoder Round #57 (div.2)
/*
题目要求每一个子串都不是括号匹配串,
实际上只要使得括号匹配的单元“()”串不是该串的子串即可。
所以最终串肯定是连续数个')'
以及连续数个'(',统计出其中代价最小的即可。
*/
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define inf -0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
typedef long long ll;
char s[1010];
int l[1010],r[1010];
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s",s);
mem0(l);
mem0(r);
int len=strlen(s);
for(int i=len-1;i>=0;i--){
if(i==len-1)
r[i]=(s[i]==')');
else
r[i]=r[i+1]+(s[i]==')');
}
for(int i=0;i<len;i++){
if(i==0)
l[i]=(s[i]=='('); //把左边的全部换成')'
else
l[i]=l[i-1]+(s[i]=='(');
}
int ans=INF;
for(int i=0;i<len;i++)
ans=min(ans,l[i]+r[i]-1); //有一个字符同时算了两次
printf("%d\n",ans);
}
return 0;
}