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

各种STL,水一水就过~~~

Posted by KatrineYang at 2016-09-10 11:21:52 on Problem 1114
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;

bool isDgt(char c){
	return c>='0' && c<='9';
}

bool isCap(char c){
	return c>='A' && c<='Z';
}

bool isSml(char c){
	return c>='a' && c<='z';
}

void parseSeq(map<string, int> &m, int times, string &equ, int start, int end){
	if(start >= end) return;
	if(isCap(equ[start])){
		if(start+1 == end || !isSml(equ[start+1])){
			string ele = "" + equ[start];
			int gs = 0;
			start ++;
			while(start < end && isDgt(equ[start])){
				gs *= 10;
				gs += equ[start]-'0';
				start++;
			}
			if(gs == 0) gs = 1;
			int add = gs * times;
			map<string, int>::iterator it = m.find(ele);
			if(it == m.end()){
				m.insert(pair<string, int>(ele, add));
			}
			else{
				it->second += add;
			}
			parseSeq(m, times, equ, start, end);
		}
		else{
			string ele = equ.substr(start, 2);
			start += 2;
			int gs = 0;
			while(start < end && isDgt(equ[start])){
				gs *= 10;
				gs += equ[start] - '0';
				start++;
			}
			if(gs == 0) gs = 1;
			int add = gs * times;
			map<string, int>::iterator it = m.find(ele);
			if(it == m.end()){
				m.insert(pair<string, int>(ele, add));
			}
			else{
				it->second += add;
			}
			parseSeq(m, times, equ, start, end);
		}
	}
	else{
		//只能是括號了
		int khgs = 1;
		int offset = start+1;
		while(1){
			if(equ[offset] == '(') khgs++;
			else if(equ[offset] == ')'){
				khgs--;
				if(khgs == 0) break;
			}
			offset++;
		}
		int gs = 0;
		int st = offset+1;
		while(st < end && isDgt(equ[st])){
			gs *= 10;
			gs += equ[st]-'0';
			st++;
		}
		if(gs == 0) gs = 1;
		parseSeq(m, times*gs, equ, start+1, offset);
		parseSeq(m, times, equ, st, end);
	}
}

void parseNumberedSeq(map<string, int> &m, string &equ, int start, int end){
	int num = 0;
	while(isDgt(equ[start])){
		num *= 10;
		num += (equ[start] - '0');
		start++;
	}
	if(num == 0) num = 1;
	parseSeq(m, num, equ, start, end);
}

void parseEqu(map<string, int> &m, string &equ){
	int len = equ.length();
	vector<int> jiahaos;
	jiahaos.push_back(-1);
	for(int i = 1; i < len-1; i++){
		if(equ[i] == '+') jiahaos.push_back(i);
	}
	jiahaos.push_back(len);
	int sz = jiahaos.size();
	for(int i = 0; i < sz-1; i++){
		parseNumberedSeq(m, equ, jiahaos[i]+1, jiahaos[i+1]);
	}
}

bool eq(map<string, int> &m1, map<string, int> &m2){
	if(m1.size() != m2.size()) return 0;
	for(map<string, int>::iterator it = m1.begin(); it != m1.end(); it++){
		map<string, int>::iterator it_ = m2.find(it->first);
		if(it_ == m2.end() || it_->second != it->second) return 0;
	}
	return 1;
}

int main() {
	map<string, int> zuo;
	string equZuo;
	cin >> equZuo;
	parseEqu(zuo, equZuo);
	int T;
	cin >> T;
	for(int ii = 0; ii < T; ii++){
		string equYou;
		cin >> equYou;
		map<string, int> you;
		parseEqu(you, equYou);
		if(eq(zuo, you)){
			cout << equZuo << "==" << equYou << endl;
		}
		else{
			cout << equZuo << "!=" << equYou << endl;
		}
	}
	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