改了两天拿的满分
大概思路是先把等号两边分开,然后提取出所有项和系数,存进vector中,最后计算所有元素的值,并比较。
遇到的错误:判断等号时遇到一个’(‘简单地从最后找‘)’,(AB)(ABAB)这种情况就会遇到错误,应该老老实实用栈判断相对应的’)’
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
class hxfcs
{
public:
void divide();
void handle();
void get_xiang();
void get_yuansu(int type,int num,string str);
void check();
int str_to_num(string str);
int find_pos(string str,int init);
hxfcs(string s);
int is_ping;//是否配平
string fcs;
string left_str;
string right_str;
vector<string> left_xiang,right_xiang;
map<string,int> left_yuansu,right_yuansu;
};
hxfcs::hxfcs(string s)
{
is_ping = 0;
fcs = s;
divide();//分成left和right
handle();
check();
}
void hxfcs::divide()
{
//cout<<fcs<<endl;
int divide_pos = fcs.find("=");
left_str = fcs.substr(0,divide_pos);
right_str = fcs.substr(divide_pos + 1,fcs.size() - 1 - divide_pos);
//cout<<left_str<<endl;
//cout<<right_str<<endl;
}
int hxfcs::find_pos(string str,int init)
{
int num = 0;
for(int i = init;i < str.size();i ++)
{
if(str[i] == '(')
num ++;
if(str[i] == ')')
{
num --;
if(num == 0)
return i;
}
}
}
int hxfcs::str_to_num(string str)
{
int num = 0;
for(int i = 0;i < str.size();i ++)
{
num += str[i] - '0';
if(i != str.size() - 1)
num *= 10;
}
return num;
}
void hxfcs::handle()
{
get_xiang();
//
for(int i = 0;i < left_xiang.size();i ++)
{
string xiang = left_xiang[i];
int num = 1;
string num_str="";
string xiang_without_num;
if(xiang[0] > '9' || xiang[0] < '0')
{
num = 1;
xiang_without_num = xiang;
}
else
{
for(int j = 0;j < xiang.size();j ++)
{
if(xiang[j]<='9' && xiang[j] >= '0')
{
num_str.append(1,xiang[j]);
}
else
break;
}
num = str_to_num(num_str);
xiang_without_num = xiang.substr(num_str.size(),xiang.size() - num_str.size());
}
//cout<<num<<" "<<xiang_without_num<<endl;
//
get_yuansu(0,num,xiang_without_num);
}
for(int i = 0;i < right_xiang.size();i ++)
{
string xiang = right_xiang[i];
int num = 1;
string num_str="";
string xiang_without_num;
if(xiang[0] > '9' || xiang[0] < '0')
{
num = 1;
xiang_without_num = xiang;
}
else
{
for(int j = 0;j < xiang.size();j ++)
{
if(xiang[j]<='9' && xiang[j] >= '0')
{
num_str.append(1,xiang[j]);
}
else
break;
}
num = str_to_num(num_str);
xiang_without_num = xiang.substr(num_str.size(),xiang.size() - num_str.size());
}
//cout<<num<<" "<<xiang_without_num<<endl;
//
get_yuansu(1,num,xiang_without_num);
}
}
void hxfcs::get_yuansu(int type,int num,string str)
{
//cout<<num<<" "<<str<<endl;
if(str[0] == '(')
{
int pos;
int c = 1;
string c_str = "";
/*for(int i = str.size() - 1;i >=0 ;i --)
{
if(str[i] == ')')
{
pos = i;
break;
}
}*/
pos = find_pos(str,0);
if(pos != str.size() - 1)
{
if(str[pos + 1] <= '9' && str[pos + 1] >= '0')
{
for(int i = pos + 1;i < str.size();i ++)
{
if(str[i] <= '9' && str[i] >= '0')
{
c_str.append(1,str[i]);
if(i == str.size() - 1)
{
c = str_to_num(c_str);
get_yuansu(type,num*c,str.substr(1,pos - 1));
break;
}
}
else
{
c = str_to_num(c_str);
get_yuansu(type,num*c,str.substr(1,i - c_str.size() - 2));
get_yuansu(type,num,str.substr(i,str.size() - i));
break;
}
}
}
else
{
get_yuansu(type,num,str.substr(1,pos - 1));
get_yuansu(type,num,str.substr(pos + 1,str.size() - pos));
}
}
else
{
get_yuansu(type,num,str.substr(1,str.size() - 2));
}
}
else if(str[0] <= 'Z' && str[0] >= 'A')
{
string next_str = "";
next_str.append(1,str[0]);
string c_str = "";
int c = 1;
int right_pos = 0;
int last = 1;
for(int i = 1;i < str.size();i ++)
{
if(str[i] <= '9' && str[i] >= '0')
{
last = 0;
for(int j = i;j < str.size();j ++)
{
if(str[j] <= '9' && str[j] >= '0')
{
c_str.append(1,str[j]);
if(j == str.size() - 1)
{
right_pos = -1;
c = str_to_num(c_str);
break;
}
}
else
{
right_pos = j;
c = str_to_num(c_str);
break;
}
}
break;
}
else if(str[i] <= 'z' && str[i] >= 'a')
{
next_str.append(1,str[i]);
}
/*else if(str[i] <= 'Z' && str[i] >= 'A')
{
last = 0;
}*/
else
{
last = 0;
right_pos = i;
c = 1;
break;
}
}
if(last == 1)
{
if(type == 0)
{
if(left_yuansu.find(next_str) != left_yuansu.end())
{
left_yuansu.find(next_str) -> second += num * c;
}
else
{
left_yuansu.insert(pair<string,int>(next_str,num * c));
}
}
else
{
if(right_yuansu.find(next_str) != right_yuansu.end())
{
right_yuansu.find(next_str) -> second += num * c;
}
else
{
right_yuansu.insert(pair<string,int>(next_str,num * c));
}
}
//cout<<"+"<<c * num<<" "<<next_str<<" now left"<<left_yuansu.find(next_str) -> second<<" now right"<<right_yuansu.find(next_str) -> second<<endl;
}
else
{
get_yuansu(type,num * c,next_str);
if(right_pos != -1)
get_yuansu(type,num,str.substr(right_pos,str.size() - right_pos));
}
}
else if(str[0] <= '9' && str[0] >= '0')
{
string c_str;
int c = 0;
int pos = -1;
for(int i = 0;i < str.size();i ++)
{
if(str[i] <= '9' && str[i] >= '0')
{
c_str.append(1,str[i]);
}
else
{
c = str_to_num(c_str);
string this_str;
if(str[i] == '(')
{
pos = find_pos(str,i);
get_yuansu(type,num * c,str.substr(i + 1,pos - i - 1));
break;
}
/*else if(str[i] <= 'Z' && str[i] >= 'A')
{
this_str.append(1,str[i]);
for(int j = i + 1;j < str.size();j ++)
{
}
}*/
}
}
}
}
void hxfcs::get_xiang()
{
int divide_pos;
string t_left_str = left_str;
string t_right_str = right_str;
while(1)
{
divide_pos = t_left_str.find("+");
if(divide_pos == -1)
{
left_xiang.push_back(t_left_str);
break;
}
else
{
left_xiang.push_back(t_left_str.substr(0,divide_pos));
t_left_str = t_left_str.substr(divide_pos + 1,t_left_str.size() - 1 - divide_pos);
}
}
while(1)
{
divide_pos = t_right_str.find("+");
if(divide_pos == -1)
{
right_xiang.push_back(t_right_str);
break;
}
else
{
right_xiang.push_back(t_right_str.substr(0,divide_pos));
t_right_str = t_right_str.substr(divide_pos + 1,t_right_str.size() - 1 - divide_pos);
}
}
//test
/*
cout<<"left:"<<endl;
for(int i = 0;i < left_xiang.size();i ++)
cout<<left_xiang[i]<<endl;
cout<<"--------------"<<endl;
cout<<"right:"<<endl;
for(int i = 0;i < right_xiang.size();i ++)
cout<<right_xiang[i]<<endl;
cout<<"--------------"<<endl;*/
}
void hxfcs::check()
{
int res = 1;
map<string,int>::iterator it1,it2;
for(it1 = left_yuansu.begin();it1 != left_yuansu.end();it1 ++)
{
//cout<<it1 -> first<<":"<<it1 -> second<<endl;
it2 = right_yuansu.find(it1 ->first);
if(it2 == right_yuansu.end() || it2 -> second != it1 ->second)
{
res = 0;
break;
}
}
for(it1 = right_yuansu.begin();it1 != right_yuansu.end();it1 ++)
{
//cout<<it1 -> first<<":"<<it1 -> second<<endl;
it2 = left_yuansu.find(it1 ->first);
if(it2 == left_yuansu.end() || it2 -> second != it1 ->second)
{
res = 0;
break;
}
}
if(res)
is_ping = 1;
else
is_ping = 0;
}
int main()
{
int n;
cin>>n;
for(int i = 0;i < n;i ++)
{
string str;
cin>>str;
hxfcs fcs(str);
if(fcs.is_ping)
cout<<'Y'<<endl;
else
cout<<'N'<<endl;
}
return 0;
}