112

Tree Summing.

#include <iostream>
#include <cstdio>
#include <sstream>
#include <string>

using namespace std;

int I;
string str;
int next_index;
bool PATHFOUND;
bool isEmpty(int a,int b)
{
	if(a+1==b && str[a]=='(' && str[b]==')')
	return 1;
	return 0;
}

int findnum(int idx)
{
	int numfoundAt=-1;
	int num=0;
	bool negative=false;
	for(int i=idx;i<str.size();i++)
	{
		if(str[i]!='(' && str[i]!=')')
		{
			numfoundAt = i;
			if(str[i]=='-')
				negative = 1,
				numfoundAt+=1;
			break;
		}
	}
	while( numfoundAt<str.size() && (str[numfoundAt]-'0')>=0 && (str[numfoundAt]-'0')<=9)
	{
		num*=10;
		num+=(str[numfoundAt]-'0');
		numfoundAt+=1;
	}
	if(negative)
	num*=(-1);
	next_index = numfoundAt;
	return num;
}
//(5 (4 (11 (7()()) (2()()) )  () )
void calc(int a,int b,int sum)
{
	int number = findnum(a);
	int j=next_index;
	int start1,start2,finish1,finish2;
	int left=0,right=0;
	while(j<str.size() && str[j]!='(')
		j+=1;
	left=1;
	start1=j;
	j+=1;
	while(left!=right)
	{
		if(str[j]=='(')
		left+=1;
		if(str[j]==')')
		right+=1;
		j+=1;
	}
	finish1=j-1;

	left=1;right=0;
	start2=j;
	j+=1;
	while(left!=right)
	{
		if(str[j]=='(')
		left+=1;
		if(str[j]==')')
		right+=1;
		j+=1;
	}
	finish2=j-1;
	bool f1 = isEmpty(start1,finish1);
	bool f2 = isEmpty(start2,finish2);
	if(f1==1 && f2==1)
	{
		if(sum+number==I)
		{
			PATHFOUND=1;
			return;
		}
	}
	else if(f1)
	{
		calc(start2,finish2,sum+number);
	}
	else if(f2)
	{
		calc(start1,finish1,sum+number);
	}
	else
	{
		calc(start1,finish1,sum+number);
		calc(start2,finish2,sum+number);
	}
}
//22 (5(4(11(7()())(2()()))())   (8(13()())(4()(1()()))))
int main()
{
	char ch;
	int j,start1,start2,finish1,finish2;
	bool foundNum,neg;
	int left,right,num,counter;
	while(scanf("%d",&I)!=EOF)
	{
		str="";
		while(scanf("%c",&ch))
			if(ch=='(')
			break;
		str+='(';
		left=1;right=0;
		while(left!=right)
		{
			scanf("%c",&ch);
			if(ch!=' ' && ch!='\n')
			str+=ch;
			if(ch=='(')
			left+=1;
			if(ch==')')
			right+=1;
		}
		//cout<<str<<"\n";
		if(str[0]=='(' && str[1]==')')
		cout<<"no\n";
		else
		{
			PATHFOUND=0;
			int number = findnum(0);
			//left tree
			j=next_index;
			left=0;right=0;
			while(j<str.size() && str[j]!='(')
				j+=1;
			left=1;
			start1=j;
			j+=1;
			while(left!=right)
			{
				if(str[j]=='(')
				left+=1;
				if(str[j]==')')
				right+=1;
				j+=1;
			}
			finish1=j-1;
			left=1;right=0;
			start2=j;
			j+=1;
			while(left!=right)
			{
				if(str[j]=='(')
				left+=1;
				if(str[j]==')')
				right+=1;
				j+=1;
			}
			finish2=j-1;
			bool f1 = isEmpty(start1,finish1);
			bool f2 = isEmpty(start2,finish2);
			//cout<<f1<<" "<<f2<<"\n";
			//cout<<start1<<" "<<finish1<<" "<<start2<<" "<<finish2<<"\n";
			if(f1==1 && f2==1)
			{
				if(number==I)
				PATHFOUND=1;
				else
				PATHFOUND=0;
			}
			else if(f1)
			{
				calc(start2,finish2,number);
			}
			else if(f2)
			{
				calc(start1,finish1,number);
			}
			else
			{
				calc(start1,finish1,number);
				calc(start2,finish2,number);
			}

			if(PATHFOUND)
			cout<<"yes\n";
			else
			cout<<"no\n";
		}
	}
	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *