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; }