fork download
  1. /*
  2. 以下は正しい構造である
  3. <a>ruby<b>php</b>python</a><a><b></b></a><a></a>
  4.  
  5. お題
  6. 与えられた文字列が正しい構造であれば1、正しくなければ0を出力しなさい
  7. <a>ruby<b>php</b>python</a><a></b></a><a></a>
  8. <a>ruby<b>php</b>python</a><a><b></a><a></a>
  9. <a>ruby<b>php</b>python</a><a><b></b></a><a>
  10. vvvc<a>ruby<b>php</b>python</a><a><b></b></a><a></a>
  11. */
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <stdbool.h>
  15. #include <ctype.h>
  16.  
  17. typedef enum { Error='e', First='F', Text='T', Left='L', Right='R', EndTag='E' } Mode;
  18.  
  19. static void
  20. parse_a(char** src, Mode* m);
  21.  
  22. static void
  23. parse_b(char** src, Mode* m);
  24.  
  25. static void
  26. parse_a(char** src, Mode* m) {
  27. char* p = *src;
  28.  
  29. for (; *p; ++p) {
  30. char ch = *p;
  31.  
  32. switch (*m) {
  33. default: case Error: *src = p; return; break;
  34. case Right:
  35. if (isalnum(ch)) *m=Text;
  36. else if (ch == '<') *m=Left;
  37. else if (ch == '>') *m=Right;
  38. else *m=Error;
  39. break;
  40. case Text:
  41. if (isalnum(ch)) *m=Text;
  42. else if (ch == '<') *m=Left;
  43. else *m=Error;
  44. break;
  45. case Left:
  46. if (ch == '/') *m=EndTag;
  47. else if (ch == 'b') { ++p; *m=Right; parse_b(&p, m); }
  48. else *m = Error;
  49. break;
  50. case EndTag:
  51. if (ch == 'a') { *src = ++p; *m=Right; return; }
  52. else *m = Error;
  53. break;
  54. }
  55. }
  56. *m=Error;
  57. }
  58.  
  59. static void
  60. parse_b(char** src, Mode* m) {
  61. char* p = *src;
  62.  
  63. for (; *p; ++p) {
  64. char ch = *p;
  65.  
  66. switch (*m) {
  67. default: case Error: *src=p; return; break;
  68. case Right:
  69. if (ch == '>') *m=Right;
  70. else if (isalnum(ch)) *m=Text;
  71. else if (ch == '<') *m=Left;
  72. else *m=Error;
  73. break;
  74. case Text:
  75. if (isalnum(ch)) *m=Text;
  76. else if (ch == '<') *m=Left;
  77. else *m=Error;
  78. break;
  79. case Left:
  80. if (ch == '/') *m=EndTag;
  81. else *m = Error;
  82. break;
  83. case EndTag:
  84. if (ch == 'b') { *src = ++p; *m=Right; return; }
  85. else *m=Error;
  86. break;
  87. }
  88. }
  89. *m=Error;
  90. }
  91.  
  92. static int
  93. parse(char* p) {
  94. Mode m = First;
  95.  
  96. for (; *p; ++p) {
  97. char ch = *p;
  98.  
  99. switch (m) {
  100. default: case Error: return 0; break;
  101. case First:
  102. if (isalnum(ch)) m = Text;
  103. else if (ch == '<') m = Left;
  104. else m = Error;
  105. break;
  106. case Text:
  107. if (isalnum(ch)) m = Text;
  108. else if (ch == '<') m = Left;
  109. else m = Error;
  110. break;
  111. case Left:
  112. if (ch == 'a') {++p; m = Right; parse_a(&p, &m); }
  113. else if (ch == 'b') {++p; m = Right; parse_b(&p, &m); }
  114. else m = Error;
  115. break;
  116. case Right:
  117. if (isalnum(ch)) m=Text;
  118. else if (ch == '<') m=Left;
  119. else m=Error;
  120. break;
  121. }
  122. }
  123. if (m == Error)
  124. return 0;
  125. return 1;
  126. }
  127.  
  128. int
  129. main(void) {
  130. char buf[1024];
  131.  
  132. while (fgets(buf, sizeof buf, stdin)) {
  133. size_t len = strlen(buf);
  134. if (buf[len-1] == '\n')
  135. buf[len-1] = '\0';
  136.  
  137. printf("%d '%s'\n", parse(buf), buf);
  138. }
  139.  
  140. return 0;
  141. }
  142.  
Success #stdin #stdout 0s 2056KB
stdin
<a>ruby<b>php</b>python</a><a><b></b></a><a></a>
<a>ruby<b>php</b>python</a><a></b></a><a></a>
<a>ruby<b>php</b>python</a><a><b></a><a></a>
<a>ruby<b>php</b>python</a><a><b></b></a><a>
vvvc<a>ruby<b>php</b>python</a><a><b></b></a><a></a>
stdout
1 '<a>ruby<b>php</b>python</a><a><b></b></a><a></a>'
0 '<a>ruby<b>php</b>python</a><a></b></a><a></a>'
0 '<a>ruby<b>php</b>python</a><a><b></a><a></a>'
0 '<a>ruby<b>php</b>python</a><a><b></b></a><a>'
1 'vvvc<a>ruby<b>php</b>python</a><a><b></b></a><a></a>'