# 13845 - Syntax forest >author: Utin ###### tags: `binary tree` --- ## Brief See the code below ## Solution 0 ```c= #include <stdio.h> #include <stdlib.h> #define NUMSYM 9 typedef enum _id { X, A, B, C, D, PLUS, TIMES, MINUS, CALL } ID; typedef struct _node { ID id; struct _node* left, * right; } Node; Node* func[26]; int data[5]; char sym[10] = "XABCD+*-@"; Node* make_node(char c); Node* create_tree(); long long count(Node* func_root, long long x); long long mod(long long num); int main() { int n, m; char func_name; scanf("%d %d", &n, &m); while (n--) { scanf(" %c", &func_name); func[func_name - 'a'] = create_tree(); } while (m--) { scanf(" %c", &func_name); for (int i = 0; i < 5; i++) scanf("%d", &data[i]); printf("%lld\n", count(func[func_name - 'a'], data[X])); } } Node* make_node(char c) { Node* new_node = (Node*) malloc(sizeof(Node)); int flag = 0; for (int i = 0; i < NUMSYM; i++) { if (c == sym[i]) { new_node->id = i; flag = 1; break; } } if (!flag) new_node->id = c - 'a' + NUMSYM; new_node->left = new_node->right = NULL; return new_node; } Node* create_tree() { char c; scanf(" %c", &c); Node* new_node = make_node(c); if (new_node->id > D && new_node->id < NUMSYM) { new_node->left = create_tree(); new_node->right = create_tree(); } return new_node; } long long count(Node* func_root, long long x) { if (func_root->id == PLUS) return mod(count(func_root->left, x) + count(func_root->right, x)); if (func_root->id == TIMES) return mod(count(func_root->left, x) * count(func_root->right, x)); if (func_root->id == MINUS) return mod(count(func_root->left, x) - count(func_root->right, x)); if (func_root->id == CALL) return mod(count(func[func_root->left->id - NUMSYM], count(func_root->right, x))); if (func_root->id == X) return mod(x); else return mod(data[func_root->id]); } long long mod(long long num) { num %= 998244353; if (num < 0) num += 998244353; return num; } // Utin ``` ## Reference