0. 首先调整的节点都为叶子节点。
1. 关键:选定一个基准叶子节点后,天平平衡时总权值为2^(depth)*叶节点权值。
2. 若调整后达到同一平衡状态,则总权值相同,故只需计算叶子节点数-max(权值相同数)。
1. 关键:选定一个基准叶子节点后,天平平衡时总权值为2^(depth)*叶节点权值。
2. 若调整后达到同一平衡状态,则总权值相同,故只需计算叶子节点数-max(权值相同数)。
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <algorithm>
#include <sstream>
#include <utility>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cctype>
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define IN() freopen("in.txt", "r", stdin)
#define OUT() freopen("out.txt", "w", stdout)
#define LL long long
#define maxn 1000005
#define maxm 200005
#define mod 1000000007
#define INF 1000000007
#define eps 1e-5
#define PI 3.1415926535898
#define N 26
using namespace std;
//-------------------------CHC------------------------------//
map<LL, int> cnt;
char s[maxn];
int idx;
int n;
void dfs(int dep) {
if (isdigit(s[idx])) {
++n;
LL sum = atol(s+idx)*(1 << dep);
cnt[sum]++;
while (isdigit(s[idx])) idx++; //走到下一个char
}
else if (s[idx] == '[') {
idx++; //跳过'['
dfs(dep + 1); //左子树
idx++; //跳过','
dfs(dep + 1); //右子树
idx++; //跳过']'
}
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
n = 0;
cnt.clear();
scanf("%s", s);
idx = 0;
dfs(0);
int ans = -INF;
for (auto i : cnt) {
ans = max(ans, i.second);
}
printf("%d\n", n - ans);
}
return 0;
}