#include<stdio.h>
#include<string.h>
int main()
{
int N;
char s[110],track[110];
scanf("%d",&N);
getchar();
while(N--)
{
memset(s,'0',sizeof(s));
memset(track,'0',sizeof(track));
gets(s);
int len=strlen(s),i,ans=0,temp,flag;
int top=0,k;
for(i=0;i<len;i++)
{
k=top; // top是变量不能直接用于计算,k记录每一次经过判断的top
temp=flag=0;
if( s[i]=='(' || s[i]=='[' )
track[top++]=s[i]; // 如果是左半边括号,就存进去
else if(s[i]==')'&&track[top-1]=='('||s[i]==']'&&track[top-1]=='[')
{
top--; // 如果是右半边括号,先跟栈顶元素比较,可以配对就出栈
}
else
{
while(k) // 如果跟栈顶元素不匹配 ,进入循环,直到找到相匹配的括号,或循环到结束为止
{
if(s[i]==')'&&track[k-1]=='('||s[i]==']'&&track[k-1]=='[') // 找到可以匹配的括号
{
temp=1;
top=k-1; // 循环到这结束,循环过程中未匹配的左括号都需要一个右括号与之匹配
break; // 用flag标记过了,所以要除去未匹配的左括号,栈顶来到k-1
}
else // 没有找到可以匹配的括号,并且没有找完所有的字符
{
flag+=1; // 记录再找到相匹配的括号或者全部找完之前找了几个字符
}
k--;
}
if(!temp)
ans+=1; // 栈中没有匹配的左括号,sum数值就要因这个右括号加一,因为若要与它匹配需要操作一步 例子:[[[[[[ )
else
ans+=flag; // 栈中有可以匹配的括号,加上两个相匹配的括号之间的括号数 eg: ([[[)
}
}
ans+=top; // ans是中间过程加的括号数,top是最后留在栈里的括号数 eg: ((([(((] ans = 3; top = 3;
printf("%d\n",ans);
}
return 0;
}