湖南生第八届大学生程序设计大赛原题 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 ...
随机推荐
- Java组合与继承生成的类中构造函数的执行顺序
[程序实例] import java.util.*; class Meal{ Meal() { System.out.println("Meal Constructor"); } ...
- js-权威指南学习笔记4
第五章 语句 1.在JS中没有块级作用域,在语句块中声明的变量并不是语句块私有的. 2.尽管函数声明语句和函数定义表达式具有相同的函数名,但二者仍然不同.两种方式都创建了新的函数对象,但函数声明语句中 ...
- java单例模式(两种常用模式)
单例模式是java中常见的设计模式 特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有的其他对象提供这一实例 单例模式是某个类只能有一个实例而且自动实例化并且向整个系统提 ...
- 重学《C#高级编程》(泛型与数组)
前段时间工作比较忙,就没有写随笔了,现在继续. 前两天重新看了泛型和数组两章,简单说下我自己的收获吧 泛型 我们知道数组是一种批量的数据格式,而泛型其实就是一种自定义的批量数据格式,当数组和C#现有的 ...
- SQL 2008 R2 数据库镜像操作
镜像操作请参考:http://blog.csdn.net/dba_huangzj/article/details/35995083 应用程序数据库连接字符串(带见证服务器即自动故障转移): DBHel ...
- pd的django个人博客教程----1:效果展示等
开发环境同to do list 1:首页:localhost/pd/ 2:导航栏测试或者生活点入: 测试:localhost/category/?cid=1 3:点击文章后进入文章显示页面 e.g:进 ...
- 递归生成树对象,应用于Easyui,Tree控件
1.生成树节点对象 /// <summary> /// 生成树的节点 /// </summary> public class TreeNode { public TreeNod ...
- 关于textbox.attributes["value"]的问题
在“修改”时,出现这个问题,后台点击修改时,应该是文本框出现一些初始值 BLL.manager bll = new BLL.manager(); Model.manager model = bll.G ...
- Jquery手机发送短信之后,进入倒计时状态
在做手机网站开发的时候,难免发生意外.这时候,就是你展示人格魅力的时候啦! 下面是自己写的一个发送验证码给手机之后,进入的一个倒计时的效果 js代码,我可是连<script type=" ...
- 解决APP中fragment重叠问题
由于内存重启,导致的frgament重叠,其原因就是FragmentState没有保存Fragment的显示状态,即mHidden,导致页面重启后,该值为默认的false,即show状态,所以导致了F ...