Advertisement
Morass

4286

Oct 17th, 2018
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define PB push_back
  4. #define ZERO (1e-10)
  5. #define INF int(1e9+1)
  6. #define CL(A,I) (memset(A,I,sizeof(A)))
  7. #define DEB printf("DEB!\n");
  8. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  9. #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
  10. typedef long long ll;
  11. typedef pair<ll,ll> pll;
  12. typedef vector<int> vi;
  13. typedef pair<int,int> ii;
  14. typedef vector<ii> vii;
  15. #define IN(n) int n;scanf("%d",&n);
  16. #define FOR(i, m, n) for (int i(m); i < n; i++)
  17. #define F(n) FOR(i,0,n)
  18. #define FF(n) FOR(j,0,n)
  19. #define FT(m, n) FOR(k, m, n)
  20. #define aa first
  21. #define bb second
  22. void ga(int N,int *A){F(N)scanf("%d",A+i);}
  23. #define MX (1<<19)
  24. typedef map<ll,int> mp;
  25. char s[1<<24];
  26. int L,W[MX],D,S[MX],X;
  27. vi g[MX];
  28. int rc(int&u){
  29.     int I=u++;
  30.     if(s[L]^91){
  31.         sscanf(s+L,"%d",W+I);
  32.         while(isdigit(s[L]))++L;
  33.         return S[I]=1;
  34.     }
  35.     ++L,g[I].PB(u),S[I]+=rc(u),++L,g[I].PB(u),S[I]+=rc(u),++L;
  36.     return S[I];
  37. }
  38. void ud(mp&G,ll I,int p){int a=G.count(I)?min(p,G[I]):p;G[I]=a;}
  39. mp dfs(int u){
  40.     mp G,a,b;
  41.     if(g[u].empty()){
  42.         G[W[u]]=0;
  43.         return G;
  44.     }
  45.     assert(g[u].size()==2u);
  46.     a=dfs(g[u][0]),b=dfs(g[u][1]);
  47.     int X=S[g[u][0]],Y=S[g[u][1]];
  48.     for(auto&h:a)if(b.count(h.aa))ud(G,h.aa*2,h.bb+b[h.aa]);
  49.                  else ud(G,h.aa*2,h.bb+Y);
  50.     for(auto&h:b)if(!a.count(h.aa))ud(G,h.aa*2,h.bb+X);
  51.     return G;
  52. }
  53. int main(void){
  54.     IN(_)F(_){
  55.         for(auto&h:g)h.clear();
  56.         scanf("%s",s),CL(S,D=L=0),rc(D),X=INF;
  57.         mp G=dfs(0);
  58.         for(auto&h:G)X=min(X,h.bb);
  59.         printf("%d\n",X);
  60.     }
  61.     return 0;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement