这道题的思路是:
首先利用char map[] = "2223334445556667-77888999-"; //ABCDEFGHIJKLMNOPQRSTUVWXYZ 对数据进行转换,转换之后的数据只包含-和数字,然后去掉字符串中的-,并重新添加上‘-’。最后排序,统计字符串的数据。
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <functional>
#include <algorithm>
using namespace std;
char map[] = "2223334445556667#77888999#";
//ABCDEFGHIJKLMNOPQRSTUVWXYZ
void visited(char &ch) // visit and format strings
{
if (ch >= 'A' && ch <= 'Z')
ch=map[ch-'A']; // ch equals to its real number
}
void replace_m( string &s)
{
string::iterator it = s.begin();
for (; it != s.end(); it ++)
{
if (*it <='P' && *it >= 'A')
{
*it = '2'+(*it-'A')/3;
}
else if(*it >'P' && *it < 'Z')
{
*it = '7'+(*it-'Q')/3;
}
}
}
int main ()
{
//freopen("1.txt","r",stdin);
int num = 0;
cin >> num;
vector<string> svec;
int cts = 0;
string inpts;
{
while (num --)
{
cin >> inpts;
inpts.erase(remove_if(inpts.begin(),inpts.end(),bind2nd(equal_to<char>(),'-')),inpts.end());
inpts.erase(remove_if(inpts.begin(),inpts.end(),bind2nd(equal_to<char>(),'Q')),inpts.end());
inpts.erase(remove_if(inpts.begin(),inpts.end(),bind2nd(equal_to<char>(),'Z')),inpts.end());
replace_m(inpts);
svec.push_back(inpts);
}
sort (svec.begin(),svec.end());
string ss = *(svec.begin());
vector<string>::iterator it = svec.begin();
++it;
int sct = 1;
int flag = 0;
int tamp = 0;
for (; it != svec.end(); it ++)
{
if (!ss.compare(*it))
{
sct ++;
tamp = 1;
}
else
{
if(sct >=2)
{
ss.insert(3,"-");
flag = 1;
cout << ss <<' ' << sct <<endl;
tamp = 0;
}
sct = 1;
ss = *it;
}
}
if(tamp && sct>=2)
{
ss.insert(3,"-");
flag = 1;
cout << ss <<' ' << sct <<endl;
tamp = 0;
}
if(!flag) cout<<"No duplicates."<<endl;
}
}
这道题木在最后输出的时候,由于统计的时候考虑疏忽,当num=2的时候,出现错误。