这个题目思路如下:对于不同层的节点,赋予不同的权值,权值是以2为基的,也就是对于第一层权值为1,第二层为2,第三层为4,依此类推,然后在分析字符串的时候我们记录相应的层数,如果分析到数字,就计算出该数字并且乘上相应的权值,存入vector中,之后对vector排序,分析vector中连续相同的数字的最大个数,那么用vector的长度减去个数就可以得到最终的结果,注意:由于在计算过程中可能会产生非常大的数值,所以我们需要使用long long int类型来避免溢出,这是个小坑,其他的具体实现见如下代码:
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
using namespace std;
int Case;
typedef long long int LL;
int main(){
cin >> Case;
LL weight[20];
weight[0] = 1;
LL i = 1;
while (i < 20){
weight[i] = weight[i - 1] << 1;
i++;
}
while (Case--){
string s;
cin >> s;
if (s[0] >= '0'&&s[0] <= '9'){
cout << "0" << endl;
continue;
}
vector<LL> data;
LL level = 0;
for (int i = 0; i < s.size(); i++){
if (s[i] == '[') level++;
else if (s[i] == ']') level--;
else if (s[i] == ',') continue;
else{
LL num = 0,j;
for (j = i; j < s.size(); j++){
if (s[j] >= '0'&&s[j] <= '9'){
num = num * 10 + (s[j] - '0');
}
else break;
}
num = num*weight[level];
data.push_back(num);
if (j > s.size()-1) i = j;
else i = j - 1;
}
}
sort(data.begin(),data.end());
LL t_ans = 1;
LL ans = -1;
for (int i = 1; i < data.size(); i++){
if (data[i] == data[i - 1]) t_ans++;
else{
ans = max(ans,t_ans);
t_ans = 1;
}
}
ans = max(ans,t_ans);
cout << data.size() - ans << endl;
}
//system("pause");
return 0;
}