Uva - 12504 - Updating a Dictionary


全是字符串相关处理,截取长度等相关操作的练习

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	int T;
	cin >> T;
	while (T--) {
		map<string, string> ma;
		string dictOld, dictNew;
		string ad[102], del[102], cha[102];
		// 分别存储增加的,减少的,变化的关键字
		cin >> dictOld >> dictNew;
		int addCount = 0;
		int deleteCount = 0;
		int changeCount = 0;

		int a = 0;
		while (dictOld.find(',', a + 1) < dictOld.size()) {
			// 这里截取方法比较重要
			string s(dictOld, a + 1, dictOld.find(',', a + 1) - a - 1);
			string kay(s, 0, s.find(':', 0));
			string value(s, s.find(':', 0) + 1, s.size() - s.find(':', 0));
			ma.insert(pair<string, string>(kay, value));
			a = dictOld.find(',', a + 1);
		}
		string s(dictOld, a + 1, dictOld.find('}', a + 1) - a - 1);

		string kay(s, 0, s.find(':', 0));
		string value(s, s.find(':', 0) + 1, s.size() - s.find(':', 0));

		if (kay.size()) {
			ma.insert(pair<string, string>(kay, value));
		}

		a = 0;
		while (dictNew.find(',', a + 1) < dictNew.size()) {
			string s(dictNew, a + 1, dictNew.find(',', a + 1) - a - 1);
			string key(s, 0, s.find(':', 0));
			string value(s, s.find(':', 0) + 1, s.size() - s.find(':', 0));

			if (ma.find(key) == ma.end()) {
				ad[addCount++] = key;
			}
			else {
				string temp = ma.find(key)->second;
				if (temp != value) {
					cha[changeCount++] = key;
				}
				ma.erase(key);
			}
			a = dictNew.find(',', a + 1);
		}

		string s1(dictNew, a + 1, dictNew.find('}', a + 1) - a - 1);
		string key1(s1, 0, s1.find(':', 0));
		string value1(s1, s1.find(':', 0) + 1, s1.size() - s1.find(':', 0));

		if (key1.size()) {
			if (ma.find(key1) == ma.end()) {
				ad[addCount++] = key1;
			}
			else {
				string temp = ma.find(key1)->second;
				if (temp != value1) {
					cha[changeCount++] = key1;
				}
				ma.erase(key1);
			}
		}

		while (ma.begin() != ma.end()) {
			string temp = ma.begin()->first;
			del[deleteCount++] = temp;
			ma.erase(temp);
		}

		if (addCount == 0 &&
			deleteCount == 0 &&
			changeCount == 0) {
			cout << "No changes\n";
		}
		else {
			if (addCount) {
				sort(ad, ad + addCount);
				cout << "+";
				for (int i = 0; i < addCount; i++) {
					if (i) {
						cout << ",";
					}
					cout << ad[i];
				}
				cout << endl;
			}
			if (deleteCount) {
				sort(del, del + deleteCount);
				cout << "-";
				for (int i = 0; i < deleteCount; i++) {
					if (i) {
						cout << ",";
					}
					cout << del[i];
				}
				cout << endl;
			}
			if (changeCount) {
				sort(cha, cha + changeCount);
				cout << "*";
				for (int i = 0; i < changeCount; i++) {
					if (i) {
						cout << ",";
					}
					cout << cha[i];
				}
				cout << endl;
			}
		}
		cout << endl;
	}

	return 0;
}


转载于:https://www.cnblogs.com/zhangyaoqi/p/4591583.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值