a53

Arh

a53
Mar 11th, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.96 KB | None | 0 0
  1. /// Sursa 100p
  2. /// student Tamio-Vesa N.
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5.  
  6. enum token_type {
  7. LBRACK = 0, RBRACK = 1, LPAR = 2, RPAR = 3, STAR = 4, INT = 5, STR = 6
  8. };
  9.  
  10. struct token {
  11. token_type t;
  12. int x;
  13. string s;
  14. };
  15.  
  16. vector<token> tokensise(string s){
  17. vector<token> ret;
  18. string current_s;
  19. int current_x = 0;
  20. int i = 0;
  21.  
  22. static token_type tab[256];
  23. tab['['] = token_type::LBRACK;
  24. tab[']'] = token_type::RBRACK;
  25. tab['('] = token_type::LPAR;
  26. tab[')'] = token_type::RPAR;
  27. tab['*'] = token_type::STAR;
  28. ///cerr << s << endl;
  29.  
  30. INIT:
  31. if(i == (int)s.size()) goto END;
  32. if(isdigit(s[i])){
  33. ///cerr << '%' << endl;
  34. current_x = s[i++] - '0';
  35. goto INTEGER;
  36. }
  37. if(isalpha(s[i])){
  38. current_s.push_back(s[i++]);
  39. goto STRING;
  40. }
  41. ret.push_back(token{ tab[(unsigned)s[i++]], 0, "" });
  42. goto INIT;
  43. STRING:
  44. if(isalpha(s[i])){
  45. current_s.push_back(s[i++]);
  46. goto STRING;
  47. }
  48. ret.push_back(token{ token_type::STR, 0, current_s });
  49. current_s.clear();
  50. goto INIT;
  51. INTEGER:
  52. if(isdigit(s[i])){
  53. current_x = 10 * current_x + s[i++] - '0';
  54. goto INTEGER;
  55. }
  56. ret.push_back(token{ token_type::INT, current_x, "" });
  57. current_x = 0;
  58. goto INIT;
  59. END:
  60. return ret;
  61. }
  62.  
  63. enum expr_type{
  64. odd_pal, even_pal, repetition, basic, concat, nil
  65. };
  66.  
  67. struct expr{
  68. expr_type t;
  69. string s;
  70. int reps;
  71. expr *leftson = 0, *rightson = 0;
  72. };
  73.  
  74. expr* parse(vector<token>::iterator& i, vector<token>::iterator e);
  75.  
  76. expr* parse_lbrack(vector<token>::iterator& i, vector<token>::iterator e){
  77. assert(i->t == token_type::LBRACK);
  78. expr *ret = new expr;
  79.  
  80. ++i;
  81.  
  82. if(i->t == token_type::STAR){
  83. ret->t = expr_type::even_pal;
  84. ++i;
  85. ret->leftson = parse(i, e);
  86. assert(i->t == token_type::RBRACK);
  87. ++i;
  88. }
  89. else{
  90. ret->t = expr_type::odd_pal;
  91. ret->leftson = parse(i, e);
  92. assert(i->t == token_type::STAR);
  93. ++i;
  94. assert(i->t == token_type::RBRACK);
  95. ++i;
  96. }
  97. return ret;
  98. }
  99.  
  100. expr* parse_num(vector<token>::iterator& i, vector<token>::iterator e){
  101. assert(i->t == token_type::INT);
  102. expr *ret = new expr;
  103. ret->t = expr_type::repetition;
  104. ret->reps = i->x;
  105. ++i;
  106.  
  107. assert(i->t == token_type::LPAR);
  108. ++i;
  109.  
  110. ret->leftson = parse(i, e);
  111.  
  112. assert(i->t == token_type::RPAR);
  113. ++i;
  114.  
  115. return ret;
  116. }
  117.  
  118. expr* parse(vector<token>::iterator& i, vector<token>::iterator e){
  119. expr* ret = new expr;
  120. if(i == e || i->t == token_type::RPAR || i->t == token_type::STAR || i->t == token_type::RBRACK)
  121. ret->t = nil;
  122. else if(i->t == token_type::INT)
  123. {
  124. ret->t = concat;
  125. ret->leftson = parse_num(i, e);
  126. ret->rightson = parse(i, e);
  127. }
  128. else if(i->t == token_type::LBRACK)
  129. {
  130. ret->t = concat;
  131. ret->leftson = parse_lbrack(i, e);
  132. ret->rightson = parse(i, e);
  133. }
  134. else if(i->t == token_type::STR){
  135. ret->t = concat;
  136. ret->leftson = new expr;
  137.  
  138. ret->leftson->t = basic;
  139. ret->leftson->s = i->s;
  140. ++i;
  141.  
  142. ret->rightson = parse(i, e);
  143. }
  144. return ret;
  145. }
  146.  
  147. void evaluate(expr *e, string& s){
  148. ///cerr << e << ' ' << e->t << "L: " << e->leftson << "R: " << e->rightson << ' ' << "S: " << e->s << endl;
  149. assert(e);
  150. if(e->t == expr_type::concat){
  151. evaluate(e->leftson, s);
  152. evaluate(e->rightson, s);
  153. }
  154. else if(e->t == expr_type::odd_pal){
  155. string tmp;
  156. evaluate(e->leftson, tmp);
  157. s.append(tmp);
  158.  
  159. tmp.pop_back();
  160. reverse(begin(tmp), end(tmp));
  161. s.append(tmp);
  162. }
  163. else if(e->t == expr_type::even_pal){
  164. string tmp;
  165. evaluate(e->leftson, tmp);
  166. s.append(tmp);
  167.  
  168. reverse(begin(tmp), end(tmp));
  169. s.append(tmp);
  170. }
  171. else if(e->t == expr_type::repetition){
  172. string tmp;
  173. evaluate(e->leftson, tmp);
  174. for(int i = 0; i < e->reps; ++i)
  175. s.append(tmp);
  176. }
  177. else if(e->t == expr_type::basic){
  178. s.append(e->s);
  179. }
  180. else if(e->t == expr_type::nil){
  181. //
  182. }
  183. }
  184.  
  185. int find_operation_count(expr *e){
  186. return e == nullptr ? 0 :
  187. find_operation_count(e->leftson) + find_operation_count(e->rightson) +
  188. (e->t == even_pal || e->t == odd_pal || e->t == repetition ? 1 : 0);
  189. }
  190.  
  191. int main(){
  192. ifstream f("arh.in");
  193. ofstream g("arh.out");
  194.  
  195. string s;
  196. f >> s;
  197.  
  198. vector<token> tok = tokensise(s);
  199. auto it = begin(tok);
  200.  
  201. ///for(auto x : tok)
  202. ///cerr << x.t << ' ' << x.s << ' ' << x.x << endl;
  203.  
  204. expr *parse_tree = parse(it, end(tok));
  205.  
  206. string ret;
  207. evaluate(parse_tree, ret);
  208.  
  209. g << find_operation_count(parse_tree) << endl << ret << endl;
  210. return 0;
  211. }
Add Comment
Please, Sign In to add comment