#LQ1359. 内存空间

内存空间

问题描述

小蓝最近总喜欢计算自己的代码中定义的变量占用了多少内存空间。

为了简化问题, 变量的类型只有以下三种:

int: 整型变量, 一个 int 型变量占用 4 Byte 的内存空间。

long: 长整型变量, 一个 long 型变量占用 8 Byte 的内存空间。

String: 字符串变量, 占用空间和字符串长度有关, 设字符串长度为 LL, 则字符串占用 LL Byte 的内存空间, 如果字符串长度为 0 则占用 0 Byte 的内存 空间。

定义变量的语句只有两种形式, 第一种形式为:

type var1=value2,var2=value2type\ var_1=value_2 , var_2=value_2 \cdots;

定义了若干个 typetype 类型变量 var1var2,var_1、var_2、 ……, 并且用 value1value2value_1、value_2 …… 初始化,

多个变量之间用 , 分隔, 语句以 ; 结尾, typetype 可能是 intlongString。例如

int a=1,b=5,c=6int\ a=1, b=5, c=6;占用空间为 12 Byte;

long a=1,b=5long\ a=1, b=5; 占用空间为 16 Byte;

String s1="",s2="hello",s3="world";占用空间为 10 Byte

第二种形式为:

type[] arr1=new type[size1], arr2=new type[size2];

定义了若干 typetype 类型的一维数组变量 arr1,arr2,arr_1,arr_2 ……, 且数组的大小为 size1size2,size1、size2 ……, 多个变量之间用 , 进行分隔, 语句以 ; 结尾, typetype 只可能是 intlong。例如

int[] a1=new int[10]; 占用的内存空间为 40 Byte;

long[] a1=new long [10],a2=new long [10]; 占用的内存空间为 160 Byte

已知小蓝有 TT 条定义变量的语句, 请你帮他统计下一共占用了多少内 存空间。结果的表示方式为: aGBbMBcKBdB, 其中 a,b,c,da,b,c,d 为统计的结果, GBMBKBB 为单位。优先用大的单位来表示。

1GB=1024MB,1MB=1024KB, 1KB=1024B, 其中 B 表示 Byte。如果 a,b,c,da,b,c,d 中的某几个数字为 0 , 那么不必输出这几个数字及其单位。题目保证一行中只有一句定义 变量的语句, 且每条语句都满足题干中描述的定义格式, 所有的变量名都是合法的且均不重复。题目中的数据很规整, 和上述给出的例子类似, 除了类型后面有一个空格, 以及定义数组时 new 后面的一个空格之外, 不会出现多余的空格。

输入格式

输入的第一行包含一个整数 TT, 表示有 TT 句变量定义的语句。 接下来 TT 行, 每行包含一句变量定义语句。

输出格式

输出一行包含一个字符串, 表示所有语句所占用空间的总大小。

1
long[] nums=new long[131072];
1MB
4
int a=0,b=0;
long x=0,y=0;
String s1="hello",s2="world";
long[] arr1=new long[100000],arr2=new long[100000];
1MB538KB546B

样例说明

样例 1 , 占用的空间为 131072×8=1048576B131072×8=1048576 B, 换算过后正好是 1MB1MB, 其 它三个单位 GBGBKBKBBB 前面的数字都为 0 , 所以不用输出。

样例 2 , 占用的空间为 4×2+8×2+10+8×100000×2B4×2+8×2+10+8×100000×2B, 换算后是 1MB538KB546B

评测用例规模与约定

对于所有评测用例, 1T101≤T≤10, 每条变量定义语句的长度不会超过 1000。所有的变量名称长度不会超过 10 , 且都由小写字母和数字组成。

对于整型变量, 初始化的值均是在其表示范围内的十进制整数, 初始化的值不会是变量。

对于 String 类型的变量, 初始化的内容长度不会超过 50 , 且内容仅包含小写字母和数字, 初始化的值不会是变量。

对于数组类型变量, 数组的长度为一个 整数, 范围为: [0,230][0,2^{30}], 数组的长度不会是变量。

TT 条语句定义的变量所占的内 存空间总大小不会超过 1GB, 且大于0B