湖南生第八届大学生程序设计大赛原题 C-Updating a Dictionary(UVA12504 - Updating a Dictionary)
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 ...
随机推荐
- linux权限及ntfs文件系统权限的知识
关于ntfs权限的问题 文件的权限: [-dcbps][u:rwx][g:rwx][a:rwx] 当中: r=4, w=2, x=1, u=owner, g=group, a=all user ...
- winrar3.7-winrar4.0的注冊码
首先新建记事本文件(txt文件),把下面红色代码复制进去,然后将文件另存为以 rarreg.key 为文件名称的文件(当然因为设置的不同,可能出现你保存后的文件为 rarreg.key.txt 没关系 ...
- Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同
本系列作为Effective JavaScript的读书笔记. prototype,getPropertyOf和__proto__是三个用来訪问prototype的方法.它们的命名方式非常类似因此非常 ...
- sql中的case when
sql语言中有没有类似C语言中的switch case的语句?? 没有,用case when 来代替就行了. 例如,下面的语句显示中文年月 select ...
- 菜鸟玩云计算之十六:Ubuntu14.04上创建的虚拟机迁移到RHEL6.4
菜鸟玩云计算之十六:Ubuntu14.04上创建的RHEL6.4虚拟机迁移到RHEL6.4主机上 RHEL6.4 Server作为虚拟机的HOST,执行以下的命令检查配置和安装相关软件: # egre ...
- Unity 制作虚拟手柄例子
Unity不愧是收费开发软件,有写好的Joystick(虚拟手柄),使用起来很简单,我们一起来学习一下哈!! 本文源代码Win版的 :http://vdisk.weibo.com/s/BDn59yfn ...
- linux文件解-压缩
常用: 解压tar.gz包 使用命令:tar -zxvf file.tar.gz -z 指有gzip的属性 -x 解开一个压缩文件的参数 -v解压过程中显示文件 -f放最后接filena ...
- 关于解决方案和web文件夹放在同一目录路径错误的问题
今天公司要做个b2b商城,下了个源码,目的是在这个基础上改,可是源码没有解决方案,于是建立了个解决方案,然后添加网站,发现解决方案和web目录位于不同目录(解决方案总是自动生成一个目录),可是我从网上 ...
- (转)反射发送实战(-)InvokeMember
反射是.net中的高级功能之一,利用反射可以实现许多以前看来匪夷所思的功能,下面是我看了<Programming C#>(O'Reilly)之后对于反射的一点实践,本想直接做个应用程序来说 ...
- asp.net 面试基础题
WebSite和WebApplication的区别1)当改变后台代码时,WebApplication需重启浏览器或者重新生成解决方案,而WebSite则不用:2)WebSite没有Solution,没 ...