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; }
转载于:https://blog.51cto.com/huahua520amy/1373621