poj1002“487-3279”解题报告
2012-08-16 09:06
183 查看
该题思路非常简单,三步:
(1)想方设法去掉‘-’字符;
(2)将字母转化成为对应的数字,注意对含有Q、Z这两个字符的处理,以及连续多个‘-’字符的处理(自己在这两个地方弄了好长时间,最后发现其实挺简单的哈);
(3)调用系统排序函数进行排序,输出格式化。
下面的代码是将自己原始的代码整理后所得,为了给大家一个清晰地代码:
下面的代码是自己的原始代码,曾经时间超时,曾经wrong answer,经过多次的修改,终于AC了,这个代码比较杂乱,供有兴趣的人参考哈,代码如下:
(1)想方设法去掉‘-’字符;
(2)将字母转化成为对应的数字,注意对含有Q、Z这两个字符的处理,以及连续多个‘-’字符的处理(自己在这两个地方弄了好长时间,最后发现其实挺简单的哈);
(3)调用系统排序函数进行排序,输出格式化。
下面的代码是将自己原始的代码整理后所得,为了给大家一个清晰地代码:
#include<iostream> #include<string> #include<map> #include<algorithm> using namespace std; int main() { freopen("in.txt","r",stdin); map<string,int> Map; int n; cin>>n; string* s_arr=new string ; int count=0; for(int k=0;k<n;++k) { string str; cin>>str; bool flag=false; //对含有Q、Z字符的处理 //处理'-'字符,并作字母向数字的转换 for(string::iterator iter=str.begin();iter!=str.end();++iter) { while('-'==(*iter)&&iter!=str.end()) { str.erase(iter); if(iter==str.end()) iter--; } if((*iter)>='A'&&(*iter)<='Z') { switch(*iter) { case 'A': case 'B': case 'C': (*iter)='2'; break; case 'D': case 'E': case 'F': (*iter)='3'; break; case 'G': case 'H': case 'I': (*iter)='4'; break; case 'J': case 'K': case 'L': (*iter)='5'; break; case 'M': case 'N': case 'O': (*iter)='6'; break; case 'P': case 'R': case 'S': (*iter)='7'; break; case 'T': case 'U': case 'V': (*iter)='8';break; case 'W': case 'X': case 'Y': (*iter)='9'; break; default: flag=true; break; } } } string::iterator it=str.end()-1; if('-'==(*it)) str.erase(it); if(!flag) { s_arr[count]=str; Map[s_arr[count]]++; count++; } } sort(s_arr,s_arr+count); bool flag_1=false; for(int i=0;i<count;++i) { if(Map[s_arr[i]]>1) { int num=Map[s_arr[i]]; Map[s_arr[i]]=0; s_arr[i].insert(3,"-"); flag_1=true; cout<<s_arr[i]<<" "<<num<<endl; } } if(!flag_1) { cout<<"No duplicates."<<endl; } return 0; }
下面的代码是自己的原始代码,曾经时间超时,曾经wrong answer,经过多次的修改,终于AC了,这个代码比较杂乱,供有兴趣的人参考哈,代码如下:
#include<iostream> #include<string> #include<map> #include<algorithm> using namespace std; int main() { //freopen("in.txt","r",stdin); map<string,int> Map; int n; cin>>n; string* s_arr=new string ; int count=0; for(int k=0;k<n;++k) { string str; cin>>str; bool flag=false; //对含有Q、Z字符的处理 //处理'-'字符,并作字母向数字的转换 for(string::iterator iter=str.begin();iter!=str.end();++iter) { while('-'==(*iter)&&iter!=str.end()) { str.erase(iter); if(iter==str.end()) iter--; } //if('-'==(*iter)) //{ // str.erase(iter); // while('-'==(*iter)) // { // str.erase(iter); // } // if(iter==str.end()) // break; //} if((*iter)>='A'&&(*iter)<='Z') { switch(*iter) { case 'A': case 'B': case 'C': (*iter)='2'; break; case 'D': case 'E': case 'F': (*iter)='3'; break; case 'G': case 'H': case 'I': (*iter)='4'; break; case 'J': case 'K': case 'L': (*iter)='5'; break; case 'M': case 'N': case 'O': (*iter)='6'; break; case 'P': case 'R': case 'S': (*iter)='7'; break; case 'T': case 'U': case 'V': (*iter)='8';break; case 'W': case 'X': case 'Y': (*iter)='9'; break; default: flag=true; break; } } } string::iterator it=str.end()-1; if('-'==(*it)) str.erase(it); if(!flag) { s_arr[count]=str; Map[s_arr[count]]++; count++; } //Map[str]++; } sort(s_arr,s_arr+count); //for(int i=0;i<count;++i) //{ // Map[s_arr[i]]++; //} bool flag_1=false; //for(map<string,int>::iterator iter=Map.begin();iter!=Map.end();++iter) //{ // if(iter->second>1) // { // flag_1=true; // string t_str=iter->first; // t_str.insert(3,"-"); //此处应该仍可优化 // cout<<t_str<<" "<<iter->second<<endl; // } //} for(int i=0;i<count;++i) { if(Map[s_arr[i]]>1) { int num=Map[s_arr[i]]; Map[s_arr[i]]=0; s_arr[i].insert(3,"-"); flag_1=true; cout<<s_arr[i]<<" "<<num<<endl; } } if(!flag_1) { cout<<"No duplicates."<<endl; } //cout<<str<<endl; //将所有的字母全部转为对应的数字 // for(int i=0;i<str.length();++i) // { // switch(str[i]) // { // case 'A': // case 'B': // case 'C': str[i]='2'; break; // case 'D': // case 'E': // case 'F': str[i]='3'; break; // case 'G': // case 'H': // case 'I': str[i]='4'; break; // case 'J': // case 'K': // case 'L': str[i]='5'; break; // case 'M': // case 'N': // case 'O': str[i]='6'; break; // case 'P': // case 'R': // case 'S': str[i]='7'; break; // case 'T': // case 'U': // case 'V': str[i]='8';break; // case 'W': // case 'X': // case 'Y': str[i]='9'; break; // default: // break; // } // } // //cout<<str<<endl; // Map[str]++; //} //输出格式化 //string* s_arr=new string ; //int loc=0; //for(map<string,int>::iterator iter=Map.begin();iter!=Map.end();++iter) //{ // if(iter->second!=1) // { // s_arr[loc]=iter->first; // loc++; // } //} ////调用系统函数,对s_arr进行排序 //sort(s_arr,s_arr+loc); //bool flag=false; //for(map<string,int>::iterator iter=Map.begin();iter!=Map.end();++iter) //{ // for(int i=0;i<loc;++i) // { // if(s_arr[i]==iter->first) // { // flag=true; // s_arr[i].insert(3,"-"); // cout<<s_arr[i]<<" "; // cout<<iter->second<<endl; // } // } //} //if(!flag) //{ // cout<<"No duplicates"<<endl; //} return 0; }
相关文章推荐
- poj1002 487-3279 解题报告
- POJ 1002 487-3279 [解题报告] Java
- Pku acm 1002 487-3279 排序算法解题报告(一) ----二叉查找数(BST)
- [POJ 1002] 487-3279 C++解题报告
- POJ 1002 解题报告 487-3279
- POJ 1002 487-3279 解题报告
- OpenJudge / POJ 1002 487-3279 解题报告 C++
- POJ 2974 487-3279 解题报告
- POJ 1002求487-3279解题报告——【PKU ACM】
- UVa 755 487--3279解题报告
- POJ-1002-487-3279-解题报告
- 百炼 POJ 2974 487-3279 解题报告
- POJ解题报告——1002 487-3279
- poj1002 487-3279
- poj1002 487-3279
- POJ1002-487-3279
- POJ1002 487-3279 直接哈希模拟
- POJ1002-487-3279
- poj1002 487-3279(电话号码重复次数)
- POJ1002 487-3279【查表】(Bailian1002, Bailian2974)