1.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct dir Dir;
  5. #define LOG(s) fprintf(stderr, s"\n");
  6. struct dir {
  7. char name[32];
  8. Dir *parent;
  9. Dir *next_sibling;
  10. Dir *child;
  11. int size;
  12. };
  13. char buf[4096];
  14. Dir root = {0};
  15. int sum = 0;
  16. int totalsize(Dir *dir) {
  17. if (dir == NULL) return 0;
  18. int total = dir->size;
  19. Dir *child = dir->child;
  20. while (child != NULL) {
  21. total += totalsize(child);
  22. child = child->next_sibling;
  23. }
  24. if (total <= 100000) sum += total;
  25. return total;
  26. }
  27. void process_ls(FILE* fp, Dir *cur) {
  28. while (1) {
  29. int c = fgetc(fp);
  30. if (c == EOF) return;
  31. ungetc(c, fp);
  32. if (c == '$') {
  33. return;
  34. }
  35. buf[0] = '\0';
  36. fgets(buf, 4096, fp);
  37. if (buf[0] == 'd') {
  38. strtok(buf, " ");
  39. char *childname = strtok(NULL, "\n");
  40. Dir *newdir = malloc(sizeof(Dir));
  41. strcpy(newdir->name, childname);
  42. newdir->parent = cur;
  43. newdir->next_sibling = cur->child;
  44. newdir->child = NULL;
  45. newdir->size = 0;
  46. cur->child = newdir;
  47. } else {
  48. char *pos;
  49. long fsz = strtol(buf, &pos, 10);
  50. cur->size += fsz;
  51. }
  52. }
  53. }
  54. void process_cmd(FILE *fp, Dir **pcur) {
  55. Dir *cur = *pcur;
  56. char *cmd = strtok(buf + 2, " \n");
  57. if (strcmp(cmd, "cd") == 0) {
  58. char *param = strtok(NULL, " \n");
  59. if (strcmp(param, "/") == 0) {
  60. *pcur = &root;
  61. } else if (strcmp(param, "..") == 0) {
  62. *pcur = cur->parent;
  63. } else {
  64. Dir *t = cur->child;
  65. while (t != NULL) {
  66. if (strcmp(t->name, param) == 0) {
  67. *pcur = t;
  68. break;
  69. } else {
  70. t = t->next_sibling;
  71. }
  72. }
  73. }
  74. } else if (strcmp(cmd, "ls") == 0) {
  75. process_ls(fp, cur);
  76. }
  77. }
  78. int main() {
  79. FILE *fp = fopen("input", "r");
  80. Dir *cur = &root;
  81. while (fgets(buf, 4096, fp)) {
  82. int len = strlen(buf);
  83. if (len <= 1) continue;
  84. char c = buf[0];
  85. if (c == '$') {
  86. process_cmd(fp, &cur);
  87. }
  88. }
  89. totalsize(&root);
  90. printf("%d\n", sum);
  91. }