湖南生第八屆大學生程序設計大賽原題 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; } 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章