Poj 1002
刚开始的时候简单写了map<string,int>映射,然后一直TLE。
后来看了各种代码改成map<int,int>,电话号码的规范化中的字母switch语句也改成存放在数组中。
不知道是编译器的问题还是什么,我用自己的dev-c++可以编译的代码在poj上总是编译错误。
另外比较坑的是虽然题目里说QZ不在映射范围内但其实测试用例中是包含QZ的,也要做处理。
1 #include<iostream> 2 #include<map> 3 #include<cstring> 4 #include<string> 5 using namespace std; 6 int translate(string s){ 7 int tran[]={ 8 2,2,2, 9 3,3,3, 10 4,4,4, 11 5,5,5, 12 6,6,6, 13 7,0,7,7, 14 8,8,8, 15 9,9,9,0 16 }; 17 int count=0; 18 int m=0; 19 for(int i=0;i<s.length();i++){ 20 if(isdigit(s[i])){ 21 m=m*10+(s[i]-'0'); 22 } 23 else if(isalpha(s[i])&&s[i]!='Q'&&s[i]!='Z'){ 24 m=m*10+(tran[s[i]-'A']); 25 } 26 } 27 return m; 28 } 29 int main(){ 30 map<int,int> dial; 31 int N; 32 int k; 33 string s; 34 cin>>N; 35 for(int i=0;i<N;i++){ 36 cin>>s; 37 int tele=translate(s); 38 dial[tele]++; 39 } 40 map<int,int>::iterator ip; 41 bool Noduplicates=true; 42 for(ip=dial.begin();ip!=dial.end();ip++){ 43 if(ip->second!=1){ 44 k=ip->first; 45 cout<<k/1000000<<k%1000000/100000<<k%100000/10000<<'-'<<k%10000/1000<<k%1000/100<<k%100/10<<k%10; 46 cout<<' '<<ip->second<<endl; 47 Noduplicates=false; 48 } 49 } 50 if(Noduplicates){ 51 cout<<"No duplicates."<<endl; 52 } 53 }
*map的使用方法
*整形从高位到低位叠加的方法