這道題的題意就是如果遇到相同的號碼就輸出,這樣用STL中的map加上string可以寫的很簡單,但是結果就不是很好了。
好囧的時間,2000ms的題1954ms卡過,在代碼中的map可以用離散化hash代替,可以大大地最佳化代碼。
My Code思路就是讀取字串,hash,然後對應的映射加1,最後統計大於等於2的全部輸出即可,cnt計數器,當cnt等於0的時候輸出No duplicates.之前漏了這個,WA了兩次。。。
#include <iostream><br />#include <cstdio><br />#include <cstring><br />#include <cstdlib><br />#include <string><br />#include <map></p><p>using namespace std;</p><p>const char hash[100]="22233344455566677778889999";</p><p>int main()<br />{<br />int n,cnt,len;<br />string ret;<br />char str[100];<br />map<string,int> mp;</p><p>scanf("%d",&n);<br />while(n--)<br />{<br />scanf("%s",str);<br />cnt=0;<br />ret="";<br />len=strlen(str);<br />for(int i=0;i<len;i++)<br />{<br />if(str[i]>='0'&&str[i]<='9')<br />{<br />ret+=str[i];<br />cnt++;<br />if(cnt==3)<br />ret+='-';<br />}<br />else if(str[i]>='A'&&str[i]<'Z'&&str[i]!='Q')<br />{<br />ret+=hash[str[i]-'A'];<br />cnt++;<br />if(cnt==3)<br />ret+='-';<br />}<br />if(cnt==7)<br />break;<br />}<br />mp[ret]++;<br />}</p><p>cnt=0;<br />map<string,int>::iterator it;<br />for(it=mp.begin();it!=mp.end();it++)<br />{<br />if((*it).second>1)<br />{<br />printf("%s %d/n",(*it).first.c_str(),(*it).second);<br />cnt++;<br />}<br />}</p><p>if(cnt==0)<br />printf("No duplicates./n");</p><p>return 0;<br />}<br />