Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

又WA了一次,一定要注意以下这些坑【附代妈】

Posted by KatrineYang at 2016-08-24 04:38:12 on Problem 1145
首先是要考慮负数
然后注意树根的外面还多一层括號,需要去掉
最后也是最坑的一点,空的子树(即"()")千万不要当作两个值为洞的叶子节点来处理,否则会多出很多莫名其妙的叶子节点。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <sstream>
using namespace std;

struct node{
	node *left;
	node *right;
	node *prev;
	bool visited;
	int val;
	int sum;
	node(){
		left = right = prev = NULL;
		visited = 0;
		sum = -2147483648;
		val = 0;
	}
};

bool getVal(node *root, int curSum, int sum){
	root->sum = curSum + root->val;
	if(root->left == NULL && root->right == NULL){
		//cout << root->sum << endl;
		if(root->sum == sum) return 1;
		else return 0;
	}
	if(root->left != NULL){
		if(getVal(root->left, root->sum, sum)) return 1;
	}
	if(root->right != NULL){
		if(getVal(root->right, root->sum, sum)) return 1;
	}
	return 0;
}

int main() {
	int sum;
	while(scanf("%d", &sum) > 0){
		bool start = 1;
		char buf[100000] = {'\0'};
		int offset = 0;
		int zuo = 0, you = 0;
		char c;
		while(scanf("%c", &c)){
			if(!start && zuo == you){
				break;
			}
			if(c == '('){
				start = 0;
				buf[offset] = c;
				offset++;
				zuo ++;
			}
			else if(c == ')'){
				buf[offset] = c;
				offset++;
				you++;
			}
			else if((c >= '0' && c <= '9') || c == '-'){
				buf[offset] = c;
				offset++;
			}
		}
		//printf("%d %s\n", sum, buf);
		int len = strlen(buf);
		if(len == 2){
			if(sum == 0) printf("yes\n");
			else printf("no\n");
			continue;
		}
		len--;
		offset = 1;
		int curVal = 0;
		node *root = new node;
		int fh = 1;
		/*
		while(buf[offset] != '('){
			if(buf[offset] == '-') fh = -fh;
			else{
				val *= 10;
				val += (buf[offset] - '0');
			}
			offset++;
		}
		root->val = val * fh;*/
		node *cur = root;
		while(offset < len){
			if(buf[offset] == '('){
				if(buf[offset+1] == ')'){
					if(!cur->visited){
						cur->visited = 1;
						cur->val = curVal * fh;
						curVal = 0;
						fh = 1;
					}
					offset += 2;
					continue;
				}
				if(!cur->visited){
					cur->val = curVal * fh;
				}
				curVal = 0;
				fh = 1;
				node *temp = new node;
				if(cur->visited) {
					cur->right = temp;
					temp->prev = cur;
					cur = temp;
				}
				else{
					cur->left = temp;
					temp->prev = cur;
					cur->visited = 1;
					cur = temp;
				}
				offset ++;
			}
			else if(buf[offset] == ')'){
				curVal = 0;
				fh = 1;
				cur = cur->prev;
				offset++;
			}
			else{
				while(buf[offset] != '('){
					if(buf[offset] == '-') fh = -1;
					else{
						curVal *= 10;
						curVal += (buf[offset] - '0');
					}
					offset++;
				}
			}
		}
		if(getVal(root, 0, sum)){
			printf("yes\n");
		}
		else{
			printf("no\n");
		}
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator