#include<cstdio>
#include<cstring>
int t;
char a[101];
int dp[101][101];//这里dp的是:从第i个字符到第j个字符之间有多少个括号需要加入匹配。
void getdp(char * a)
{
memset(dp,0,sizeof(dp[0][0]));
for(int i=0;i<101;i++)
dp[i][i]=1;//初始化dp
for(int j=1;j<strlen(a);j++)//第i~j-1个字符到j所需要的括号数。
for(int i=0;i<j;i++)
{
/* if(a[j]=='('||a[j]=='[')
{
dp[i][j]=dp[i][j-1]+1;
continue;
} */
int k=j;
dp[i][j]=dp[i][j-1]+1;
for(;k>=i;k--)
{
if(a[k]=='['&&a[j]==']'||a[k]=='('&&a[j]==')')
{
if(dp[i][j]>dp[i][k-1]+dp[k+1][j-1])
{
dp[i][j]=dp[i][k-1]+dp[k+1][j-1];
}
}
}
}
}
int main()
{
/*
1.当i==j时,dp的值必定为1.
2.当char[i]与char[j]匹配时,dp[i][j]=dp[i+1][j-1];
3.当char[i]与char[j-1]之间有与char[j]匹配的字符char[k] k>=i&&k<=j-1
dp[i][j]=dp[i][k-1]+dp[k+1][j-1];(由2推导)
注意存在多个k的情况,取dp[i][k-1]+dp[k+1][j-1]最小的情况。
4.当不存在k时
dp[i][j]=dp[i][j-1]+1;
*/
scanf("%d",&t);
getchar();//清缓存
while(t--)
{
gets(a);
getdp(a);
printf("%d\n",dp[0][strlen(a)-1]);
/* for(int i=0;i<strlen(a);i++)
{
for(int j=0;j<strlen(a);j++)
printf("%2d",dp[i][j]);
puts("");
} */
}
return 1;
}