UVA12504 - Updating a Dictionary
给出两个字符串,以相同的格式表示原字典和更新后的字典。要求找出新字典和旧字典的不同,以规定的格式输出。
算法操作:
(1)处理旧字典,将旧字典中的每对关键字及其价值从字典串中截取出来,压入容器中。用做新旧字典对比检索。
(2)处理新字典,将新字典中的每对关键字及其价值从字典串中截取出来。对于每个关键字,在容器中检索相同的关键字。若检索不成功,该关键字是新字典新增的,处理存储到相关的串数组中。若检索成功,提取容器中该关键字的价值与新字典中该关键字的价值对比,若值相同,该关键之没有改变,不予处理;若价值不同,处理存储到相关的串数组中。对于检索成功的关键字,处理完后立即将其从容器中删除,以免影响后续操作。
(3)处理容器中剩下的关键字及其价值。新字典处理完后,容器中剩余的都是旧字典更新后删除的关键字。提取容器中所有剩余关键字,并将其处理存储到相关串数组中。
(4)对处理所得结果【关键字及其价值变化后存储的数组】进行判断输出。完全没有变化,输出“No changes”;否则,按照题目要求的格式输出相关变化值。
难点:
(1)截取关键字及其价值的操作,字符串综合应用(*****)
(2)处理新字典中关键字和旧字典中关键字的操作【关键删除和价值不同的变化】,容器的基本应用(**)
(3)处理旧字典中删除的关键字的操作【map容器方法的应用】,容器的高级应用(***)
(4)输出格式,逗号隔开(*)
易错点:
(1)关键字及其价值截取长度,截取的起始位置和终止位置
(2)关键字的价值的长度可能大于20,__int64存储可能会溢出,要用字符串存储
(3)空字典—>非空字典,非空字典—>空字典 的转换,不予处理会出错
(4)输出格式,中间有逗号,最后有空行
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<map> using namespace std; int main()
{
//freopen("in.txt","r",stdin); string str1,str2;
int add1,d,m; // <增加的,减少的,价值变化的>关键字的个数
string ad[102],decr[102],mul[102]; // 存储<增加的,减少的,价值变化的>关键字 int t;
cin>>t; //t组数据
while(t--)
{
map<string,string> ma; //主要查找索引的容器 cin>>str1>>str2; //输入两个“字典” add1=0; //初始化为0,表示都还没有
d=0;
m=0; int a=0; //截取检索的起始位置为0 while(str1.find(',',a+1)<str1.size()) //当串中没有逗号的时候结束【截取关键字和其价值】
{
string s(str1,a+1,str1.find(',',a+1)-a-1); //截取到一组关键字及其价值【上一个逗号到下一个逗号之间】 string x(s,0,s.find(':',0));
string y(s,s.find(':',0)+1,s.size()-s.find(':',0)); //分离一组关键字及其价值【分号为分割符】 ma.insert(pair<string,string>(x,y)); //把关键字及其价值作为一组索引,插入到容器map中 a=str1.find(',',a+1); //下组关键字截取的起始位置,从本组关键字截取的末尾位置后面的逗号的下一个字符开始
} string s(str1,a+1,str1.find('}',a+1)-a-1); //逗号为界的已经截取完,最后一组数据,截取标志是【右大括号】 string x(s,0,s.find(':',0));
string y(s,s.find(':',0)+1,s.size()-s.find(':',0)); if(x.size()!=0) ma.insert(pair<string,string>(x,y)); //若最后一组是【空】,该字典为空字典,截取的空字符串不予处理 a=0;
while(str2.find(',',a+1)<str2.size())
{
string s(str2,a+1,str2.find(',',a+1)-a-1); string x(s,0,s.find(':',0));
string y(s,s.find(':',0)+1,s.size()-s.find(':',0)); if(ma.find(x)==ma.end())ad[add1++]=x; //在容器map中检索不到关键字x,x是新加进来的,更新【增加的关键字的串数组(添加)】
else //在map中检索到该关键字
{
string temp=ma.find(x)->second; //取出容器中该关键字对应的价值
if(temp!=y)mul[m++]=x; //价值不同,改变【价值变化关键字的串数组(增加)】
ma.erase(x); //检索应用过的,直接删除,免得影响后面的操作
}
a=str2.find(',',a+1);
} string s1(str2,a+1,str2.find('}',a+1)-a-1); string x1(s1,0,s1.find(':',0));
string y1(s1,s1.find(':',0)+1,s1.size()-s1.find(':',0)); if(x1.size()!=0) //【第二个字典是空字典】
{
if(ma.find(x1)==ma.end())ad[add1++]=x1;
else
{
string temp=ma.find(x1)->second;
if(temp!=y1)mul[m++]=x1;
ma.erase(x1);
} } while(ma.begin()!=ma.end()) //处理两个字典对照后,容器中的关键字【第一个字典更新后,删掉的关键字】
{
string temp=ma.begin()->first;
decr[d++]=temp;
ma.erase(temp);//处理过的就删除,知道容器为空,处理结束
} if(add1==0&&d==0&&m==0)cout<<"No changes"<<endl; //关键字变化的总个数为0【字典更新后没有变化】 else
{
if(add1!=0) //字典跟新后,关键字有增加
{
sort(ad,ad+add1);
cout<<"+";
for(int i=0;i<add1;i++)
{
if(i!=0)cout<<",";
cout<<ad[i];
}
cout<<endl;
} if(d!=0) //字典更新后,关键字减少
{
sort(decr,decr+d);
cout<<"-";
for(int i=0;i<d;i++)
{
if(i!=0)cout<<",";
cout<<decr[i];
}
cout<<endl;
} if(m!=0) //字典更新后,有关键字的价值变化
{
sort(mul,mul+m);
cout<<"*";
for(int i=0;i<m;i++)
{
if(i!=0)cout<<",";
cout<<mul[i];
}
cout<<endl;
}
} cout<<endl;
}
return 0;
}
湖南生第八届大学生程序设计大赛原题 C-Updating a Dictionary(UVA12504 - Updating a Dictionary)的更多相关文章
-
湖南省第八届大学生程序设计大赛原题 D - 平方根大搜索 UVA 12505 - Searching in sqrt(n)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30746#problem/D D - 平方根大搜索 UVA12505 - Searchin ...
-
湖南省第六届大学生程序设计大赛原题 F Biggest Number (UVA1182)
Biggest Number http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30851#problem/F 解题思路:DFS(检索)+BF ...
-
第八届河南省程序设计大赛-B.最大岛屿0000110011000000
最大岛屿 时间限制: ...
-
第十一届GPCT杯大学生程序设计大赛完美闭幕
刚刚过去的周六(6月7号)是今年高考的第一天,同一时候也是GPCT杯大学生程序设计大赛颁奖的日子,以下我们用图文再回想一下本次大赛颁奖的过程. 评审过程的一些花絮<感谢各位评审这些天的付出!&g ...
-
NYOJ--1236--挑战密室(第八届河南省程序设计大赛)
挑战密室 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室.Dr. Kong必须尽快找到解锁密 ...
-
nyoj 1239 引水project (河南省第八届acm程序设计大赛)
题目1239 pid=1239" style="color:rgb(55,119,188)">题目信息 pid=1239" style="col ...
-
nyoj1237 最大岛屿(河南省第八届acm程序设计大赛)
题目1237 pid=1237" style="color:rgb(55,119,188)">题目信息 执行结果 本题排行 讨论区 最大岛屿 时间限制:1000 m ...
-
第13届 广东工业大学ACM程序设计大赛 C题 平分游戏
第13届 广东工业大学ACM程序设计大赛 C题 平分游戏 题目描述 转眼间又过了一年,又有一届的师兄师姐要毕业了. 有些师兄师姐就去了景驰科技实习. 在景驰,员工是他们最宝贵的财富.只有把每一个人 ...
-
nyoj 1238 最少换乘 (河南省第八届acm程序设计大赛)
题目1238 题目信息 执行结果 本题排行 pid=1238" style="text-decoration:none; color:rgb(55,119,188)"&g ...
随机推荐
-
【日常笔记】java文件下载返回数据流形式
@RequestMapping("/downloadFile") @ResponseBody public void download(String uploadPathUrl, ...
-
Android Studio 连接提交Git
转载:http://www.jianshu.com/p/061d24a6b798 之前一直在使用SVN的时候,就听说Git是个很强大的版本控制工具,最近比较闲,又赶上在痛苦的学习着使用Android ...
-
Ubuntu下部署java JDK和eclipse IDE
安装Java编程开发环境: Ubuntu默认安装openjava,可以通过java -version查看是否安装.但我使用Ubuntu9.10升级到10.04LTS时,openjava没有了.另外,如 ...
-
iOS 开发中常见的设计模式
最近有小伙伴问到在iOS开发中的几种设计模式,这里摘录一下别人的总结(因为已经感觉总结得差不多了,适用的可以阅读一下) 首先是开发中的23中设计模式分为三大类:1.创建型 2.结构型 3.行为型 (i ...
-
PowerDesigner将PDM导出生成WORD文档--温习老知识
转:http://www.cnblogs.com/wudiwushen/archive/2010/05/13/1734812.html 今天的温习老知识,是如何将一个PD设计的PDM来导出WORD文档 ...
-
调用Android系统设置中的Intent
开发Android软件时,常常需要打开系统设置或信息界面,来设置相关系统项或查看系统的相关信息,这时我们就可以使用以下语句来实现:(如打开“无线和网络设置”界面) Intent intent = ne ...
-
得到JAVA项目根文件夹
获得的相对路径 说明:相对路径(这并不说明什么时候相对谁)可以通过以下来获得(无论是一般java项目或web工程) String path = System.getProperty("use ...
-
HttpClient与浏览器调用服务接口差异
我用httpclient访问接口,统计图有些不均匀,差距较大 ,有时只有几十毫秒,下图看到这种情况占多数,600-800毫秒之间的算是浏览器正常的产生调用接口的时间耗时 然后用jmeter跑时都是均值 ...
-
unitest中HTML测试报告的优化
简介: 为每一个测试用例添加说明,那么将会使测试报告更加易读,工作中汇报数据的技巧 其实就是添加u“msg”即可 # -*- coding:UTF-8 -*- __autor__ = 'zhouli' ...
-
jq页面加载分割截图
<script> $(document).ready(function() { if (!Array.prototype.forEach) { Array.prototype.forEac ...