最小生成树
题号:NC15616
时间限制:C/C++/Rust/Pascal 4秒,其他语言8秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

给你一个无向的完全图,每个点都有一个特征值,若两点的特征值分别为u 和v,则这两点间的边的权重为u & v (& 就是按位与)。
给你一个正整数M,对于i = 0 ~ M - 1,告诉你此图中,特征值为i 的点有几个,请求出此图的最小生成树(Minimum Spanning Tree)上的边的权重和。

输入描述:

输入共有 2 行。
第一行包含一个正整数 M,代表给定图中每个点的特征值都是小于 M 的非负整数。
第二行是一个长度为M 的字串S,此字串由数字字元组成(也就是'0' 至'9'),第i 个数字字元即代表特征值为 i-1 的点的个数。

输出描述:

请输出一行包含一个整数,代表给定的图的最小生成树的边的权重和。
示例1

输入

复制
4
0514

输出

复制
4

说明

此图共有 10 个点, 5 个点为特征值为 1,1 个点特征值为 2,还有 4 个点特征值为 3。
此图的其中一个最小生成树如下图,此生成数的权重和为 (1&2)×5+(3&1)×4=4

示例2

输入

复制
8
00090999

输出

复制
62

备注:

2≤M≤217
M 是 2 的幂次方
字串 S 的长度为 M,且由数字字符'0' 至 '9' 组成
S 中至少有一个非 '0' 字符