fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <cctype>
  5. #include <stack>
  6.  
  7. enum class Sym{
  8. None,
  9. AL,
  10. AR,
  11. BL,
  12. BR,
  13. Text,
  14. };
  15.  
  16. typedef std::vector<Sym> SType;
  17. typedef std::stack<Sym> STType;
  18.  
  19. bool Parse(SType& S){
  20. STType ST;
  21. for (std::size_t i = 0; i < S.size(); i++){
  22. switch (S[i])
  23. {
  24. case Sym::AL:
  25. case Sym::BL:
  26. ST.push(S[i]);
  27. break;
  28. case Sym::AR:
  29. if (ST.top() == Sym::AL){
  30. ST.pop();
  31. }
  32. else{
  33. return false;
  34. }
  35. break;
  36. case Sym::BR:
  37. if (ST.top() == Sym::BL){
  38. ST.pop();
  39. }
  40. else{
  41. return false;
  42. }
  43. break;
  44. case Sym::Text:
  45. break;//noting process.
  46. default:
  47. break;
  48. }
  49. }
  50. return ST.size() == 0;
  51. }
  52.  
  53. bool MakeHoge(std::string& S){
  54. SType SV;
  55. Sym Sy=Sym::None;
  56. int P = 0;
  57. for (std::size_t i = 0; i < S.size(); i++){
  58. P = 0;
  59. if (isalnum(S[i]) == 0){
  60. if (S[i + P] != '<') continue;
  61. P++;
  62. if (S[i + P] == 'a' || S[i + P] == 'b' || S[i + P] == '/'){
  63. if (S[i + P] == 'a') Sy = Sym::AL;
  64. if (S[i + P] == 'b') Sy = Sym::BL;
  65. }
  66. P++;
  67. if (S[i + P] == 'a' || S[i + P] == 'b' || S[i + P] == '>'){
  68. if (S[i + P] == 'a') Sy = Sym::AR;
  69. if (S[i + P] == 'b') Sy = Sym::BR;
  70. }
  71. else{
  72. Sy = Sym::None;
  73. }
  74. if (Sy != Sym::None){
  75. SV.push_back(Sy);
  76. Sy = Sym::Text;
  77. i += P;
  78. }
  79. }
  80. else{
  81. Sy = Sym::Text;
  82. for (; i < S.size(); i++){
  83. if (isalnum(S[i]) == 0){
  84. SV.push_back(Sy);
  85. i--;
  86. break;
  87. }
  88. }
  89. }
  90. }
  91.  
  92. return Parse(SV);
  93. }
  94.  
  95. int main(){
  96. std::string S;
  97. bool F = false;
  98.  
  99. S = "<a>ruby<b>php</b>python</a><a><b></b></a><a></a>";
  100. F = MakeHoge(S);
  101. std::cout << '\"' << S << '\"' << " -> " << F << std::endl;
  102.  
  103. S = "<a>ruby<b>php</b>python</a><a></b></a><a></a>";
  104. F = MakeHoge(S);
  105. std::cout << '\"' << S << '\"' << " -> " << F << std::endl;
  106.  
  107. S = "<a>ruby<b>php< / b>python< / a><a><b>< / a><a>< / a>";
  108. F = MakeHoge(S);
  109. std::cout << '\"' << S << '\"' << " -> " << F << std::endl;
  110.  
  111. S = "<a>ruby<b>php< / b>python< / a><a><b>< / b>< / a><a>";
  112. F = MakeHoge(S);
  113. std::cout << '\"' << S << '\"' << " -> " << F << std::endl;
  114.  
  115. S = "vvvc<a>ruby<b>php</b>python</a><a><b></b></a><a></a> ";
  116. F = MakeHoge(S);
  117. std::cout << '\"' << S << '\"' << " -> " << F << std::endl;
  118.  
  119. S = "vvvc";
  120. F = MakeHoge(S);
  121. std::cout << '\"' << S << '\"' << " -> " << F << std::endl;
  122.  
  123. return 0;
  124. }
Success #stdin #stdout 0s 3232KB
stdin
Standard input is empty
stdout
"<a>ruby<b>php</b>python</a><a><b></b></a><a></a>" -> 1
"<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>" -> 0
"vvvc<a>ruby<b>php</b>python</a><a><b></b></a><a></a> " -> 1
"vvvc" -> 1