[cpp]
/**這道題的難度在於建樹,因為輸入可能不在一行,所以不能用字符串接收
*必須一個一個讀,我這裡是用getchar(),(當然scanf也行),每次讀取到
*‘(’時,開始接收數據,如果是‘)’,子樹為空,否則的話就是數字(可能是
*負數),這裡有一個注意的地方就是空格,也坑了我很久,當時沒有想到windows
*和linux的差異,最後用庫函數isspace解決。。。
*/
#include <cstdio>
#include <cctype>
using namespace std;
struct Node {
int v;
Node *lc, *rc;
};
bool flag;
void pre_create_tree(Node *&root) {
char c;
int v = 0, leap = 0;
if( !flag ) while( getchar() != '(' );
while( c = getchar() ){
if( isspace(c) ) continue;
if( c == '(' || c == ')' ) break;
if( c == '-' ) {leap = 1; continue ;}
v *= 10;
v += c - '0';
}
if( ')' == c ){
root = NULL;
flag = false;
}
else {
flag = true;
if( leap ) v = -v;
root = new Node;
root->v = v;
pre_create_tree(root->lc);
pre_create_tree(root->rc);
}
}
void pre_traverse(Node *root, int ans){
if( flag ) return ;
if( !root ) return ;
ans -= root->v;
if( root->lc ) pre_traverse(root->lc, ans);
if( root->rc ) pre_traverse(root->rc, ans);
if( !ans && !root->lc && !root->rc ) flag = true;
}
int main(int argc, char const *argv[]) {
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int ans, c;
while( ~scanf("%d", &ans) ) {
Node *root;
flag = false;
pre_create_tree(root);
while( c = getchar() ){
if( c == '\n' ) break;
if( c == EOF ) break;
}
pre_traverse(root, ans);
if( flag ) printf("yes\n");
else printf("no\n");
}
return 0;
}