CSU 1113 Updating a Dictionary(map容器应用)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1113

解题报告:输入两个字符串,第一个是原来的字典,第二个是新字典,字典中的元素的格式为一个关键字对应一个值,输入格式如下:

{a:3,b:4,c:10,f:6}
{a:3,c:5,d:10,ee:4}冒号前面的表示关键字,冒号后面的数字表示值,关键字由小写字母组成。现在让你判断,如果新的字典相对于原来的字典有新增的关键字以以下格式输出 :+key1,key2,....如果新的字典相对于原来的字典少了关键字以以下格式输出:-key1,key2....如果新的字典的关键字对于原来的字典的相同的关键字对应的值有变化以以下格式输出:*key1,key2...

主要有两个过程,首先把输入拆分成一个一个元素的形式存入map容器,然后就是比较的过程,这个简单了。要注意的是同一个关键字可能输入多次,所以要注意去重。然后还有据说这个题目的输入有问题,输入的时候有两个换行符,不过你只要都用scanf输入就行了,不用管。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cmath>
 6 #include<deque>
 7 #include<queue>
 8 #include<cstdlib>
 9 #include<string>
10 #include<map>
11 using namespace std;
12 const int maxn = 205;
13 map<string,string> old,New;
14
15 char str[2][maxn];
16 int changeto(map<string,string>& mp,char* str)
17 {
18     string a = "",b = "";
19     int len = strlen(str),f = 0;
20     for(int i = 0;i < len;++i)
21     {
22         if(str[i] == ‘{‘ || str[i] == ‘,‘ || str[i] == ‘}‘)
23         {
24             mp.insert(pair<string,string> (a,b));
25             a = "";
26             b = "";
27             continue;
28         }
29         if(str[i]  >= ‘a‘ && str[i] <= ‘z‘)
30         a += str[i];
31         else if(str[i] >= ‘0‘ && str[i] <= ‘9‘)
32         b += str[i];
33     }
34     return f;
35 }
36 int main()
37 {
38     int T,flag = 0;
39     scanf("%d",&T);
40     while(T--)
41     {
42         scanf("%s%s",str[0],str[1]);
43         int num1 = changeto(old,str[0]);
44         int num2 = changeto(New,str[1]);
45         int j,ff = 0,fff = 0;
46         for(map<string,string>::iterator iter = New.begin();iter != New.end();++iter)
47         {
48             if(old.insert(*iter).second == 1)
49             {
50                 printf(ff? ",%s":"+%s",iter->first.c_str());
51                 old.erase(iter->first);    // 插入成功的话一定要记得删除,不然会影响后面的查找
52                 ff = 1;
53             }
54         }
55         if(ff) puts("");
56         fff = max(ff,fff);
57         ff = 0;
58         for(map<string,string>::iterator iter = old.begin();iter != old.end();++iter)
59         {
60             if(New.insert(*iter).second == 1)
61             {
62                 printf(ff? ",%s":"-%s",iter->first.c_str());
63                 New.erase(iter->first);
64                 ff = 1;
65             }
66         }
67         if(ff) puts("");
68         fff = max(ff,fff);
69         ff = 0;
70         for(map<string,string>::iterator iter = New.begin();iter != New.end();++iter)
71         {
72             if(old.insert(*iter).second == 0 && old[iter->first] != New[iter->first])
73             {
74                 printf(ff? ",%s":"*%s",iter->first.c_str());
75                 ff = 1;
76             }
77         }
78         if(ff) puts("");
79         fff = max(ff,fff);
80         if(fff == 0) puts("No changes");
81         puts("");
82         old.clear();
83         New.clear();
84     }
85     return 0;
86 }

时间: 2024-10-26 16:06:47

CSU 1113 Updating a Dictionary(map容器应用)的相关文章

HDU 1113 Word Amalgamation (map 容器 + string容器)

http://acm.hdu.edu.cn/showproblem.php?pid=1113 Problem Description In millions of newspapers across the United States there is a word game called Jumble. The object of this game is to solve a riddle, but in order to find the letters that appear in th

【UVA】12504 - Updating a Dictionary(map,string,vector模拟)

一般的模拟题,一开始WA,可能是用string的容器放char,改成string就过了 14073581 12504 Updating a Dictionary Accepted C++ 0.032 2014-08-21 07:12:19 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<st

UVa 12504 Updating a Dictionary(更新字典)

题意  比较两个字典  按字典序输出所有添加 删除 修改的项   如果没有任何更新  输出  No changes STL map的应用  对比两个字典  注意开始字符串的处理和字典可以为空 #include<bits/stdc++.h> using namespace std; map<string, string> d[2]; map<string, string>::iterator it; const int N = 105; string s, a, b, t

hdu 4941 Magical Forest (map容器)

Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 135    Accepted Submission(s): 69 Problem Description There is a forest can be seen as N * M grid. In this forest, there is so

简单即用的临时Map容器(参考TimeCacheMap和RotatingMap)

因为业务需要,经常会缓存一些临时数据.比如:手机号发送验证码, 60s内同一个手机号不能重复发送验证码.查询航班信息,缓存1分钟热门查询数据.... 之前一直使用redis作为数据缓存,简单方便..但是如果是个小App,数据没有那么大,可能需要缓存的数据只有不到100KB,使用redis就大材小用 最近一个项目上线的时候,老大跟我说:真的有必要用redis么..不行就先删掉吧..自己想了下,因为App入口有两个ip,不同机器,虽然业务量不大,为了session共享,还是上了 如果只有一个入口(不

【转】C++中map容器的说明和使用技巧

C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值. 一.map的说明    1   头文件   #include   <map>     2   定义   map<string,   int>   my_Map;   或者是typedef     map<string,   int>   MY_MAP;   MY_MAP   my_Map;     3   插入数据   (1)   my_Map["

HNU 12888 Encryption(map容器)

题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12890&courseid=274 解题报告:输入一个有n个单词的句子,然后再输入这n个单词对应的意思是什么,要你翻译出这个句子最后是什么. 一个裸的map 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm>

c++ STL map容器成员函数

map容器用于查找,设置键值和元素值,输入键值,就能得到元素值.map对象中的元素时刻都是有序的,除非无序插入的.它是用平衡树创建的.查找很快. 函数 描述,注意有r的地方都是不能用it代替的. map (comp,alloc) map (it first, it last, comp,alloc) map (map& x) Comp为比较函数,用于排序,alloc不用鸟它.两个参数有默认值,可不填,按默认的.创建空map. 用一段元素填充,并设置排序函数. 拷贝x中的元素并创建新map.估计新

关于map 容器insert顺序

今天测试我的节点,maya一次次死掉,一点一点的打印测试,良久才知:我想当然的将插入map的顺序,作为我执行的顺序直接遍历,打印数据显示,map有自动将键值排序的功能,比如以字符串为例,会按照a.b.c....顺序排好. 而且对于map,如果一个元素key不存在,但是直接map[key],那么map的size就增加1,我感觉有点儿相当于insert,但map[key]没有值.这样很不规范,对于有一定代码量的程序测试造成不必要的困扰,所以最好使用find函数,判断是否==map.end() 关于s