其他分享
首页 > 其他分享> > 清华大学历年考研复试机试真题 - 1329. 文件系统

清华大学历年考研复试机试真题 - 1329. 文件系统

作者:互联网

B君在设计一个文件系统。

B君在这个文件系统里,有 n 个文件夹。

B君想知道表示这 n 个文件夹所在路径的字符串,长度之和是多少。

一个文件夹的路径是,自己和所有祖先文件夹名字,以/分割连接起来,其中最前的一个文件夹前加/,最后一个文件夹后不加/。

比如对于样例,它的文件结构为

Users
wwwwodddd
Documents
Downloads
System
5个文件夹的的路径分别为(按照输入的顺序)

/Users
/Users/wwwwodddd
/Users/wwwwodddd/Documents
/System
/Users/wwwwodddd/Downloads
他们的长度分别是 6,16,26,7,26,所以所有长度和为 81。

特别注意,根目录/不是一个文件夹,他的路径长度不应被计算在最终答案中。每个字符串开头的/不是根目录的意思,这里的/应该被计入答案。

输入格式
输入第一行一个正整数 n,表示一共有 n 个文件夹。

以下 n 行每行描述一个文件夹,第 i 行描述第 i 个文件夹,有一个整数 fi 和一个字符串 si。

fi 表示第 i 个文件夹的父文件夹是第 fi 个文件夹,特别的,如果 fi 为 0,那么说明这个文件夹在根目录。

si 表示第 i 个文件夹的名字,这个名字一定由数字和大小写字母组成。

保证在同一个文件夹下不存在多个文件夹同名,保证每个文件夹的长度至多为12。

输出格式
输出一行一个整数,表示所有路径长度的和。

数据范围
1≤n≤1000,
1≤i≤n,
0≤fi<i
输入样例:
5
0 Users
1 wwwwodddd
2 Documents
0 System
2 Downloads
输出样例:
81

#include <stdio.h>
#include <string.h>
int main(){
    int n,i,j,sum=0;
    scanf("%d",&n);
    int a[n+1],b[n+1];          //a[i]记录第i个文件 单独的长度 b[i]记录第i个文件 路径长度
    memset(a,0,sizeof(a));      //初始化只要是为了a[0]=b[0]=0 即根目录长度为0
    memset(b,0,sizeof(b));
    char t[13];
    for(i=1;i<=n;i++){
        scanf("%d %s",&j,t);
        a[i]=strlen(t)+1;       //+1是因为每个文件名前面加一个"\"
        b[i]=a[i]+b[j];         //b[j]是其前缀 a[i]是其本身 相加就是其路径长度
        sum+=b[i];
    }
    printf("%d",sum);
    return 0;
}

标签:Users,真题,根目录,1329,复试,文件夹,fi,长度,wwwwodddd
来源: https://blog.csdn.net/weixin_49548350/article/details/114295999