题目大意:这道题是中文的,题意就略了吧;
我的思路是:先把字符串里面的-过滤掉,然后再用转换函数,将字符映射到响应的数字,然后排序,记录,输出结果;
开始我本来打算用map容器来做这个题的,可是discuss里面说这个方法容易超时,所以最后还是选用了if语句,虽然长一点但是保证效率,呵呵;
心得嘛,我发现百度上写的那篇关于sscanf用法的文章有误,我在这里给它修正一下,那里提到过周星星同学的用法,里面说用sscanf可以过滤的字符串中的指定内容,其实并非如此;百度原文如下:
“4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf ”
实际上,如果你把大写字母插入到数字和小写字母之间时,buf只能够取到大写字母前面部分的内容;
如sscanf("12345BCDEFabcdedf", "%[1-9a-z]", buf);
在输出buf的值,出来后应该是12345;
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <map>
#include <iostream>
#include<cstring>
using namespace std;

struct node


{

int data;
int num;
};






int phonenum[100001];
node record[100001];
char oritemp[200];
char midtemp[200];
char destemp[200];

void collect(char a[])


{
int len=strlen(a);
int pos=0;
int i;
for(i=0;i<len;i++)

{
if(a[i]!='-')

{
midtemp[pos]=a[i];
pos++;
}
}
midtemp[pos]='\0';
}




void convert(char a[])


{
int i;
for(i=0;i<7;i++)

{
if(a[i]=='A'||a[i]=='B'||a[i]=='C')
destemp[i]='2';
else if(a[i]=='D'||a[i]=='E'||a[i]=='F')
destemp[i]='3';
else if(a[i]=='G'||a[i]=='H'||a[i]=='I')
destemp[i]='4';
else if(a[i]=='J'||a[i]=='K'||a[i]=='L')
destemp[i]='5';
else if(a[i]=='M'||a[i]=='N'||a[i]=='O')
destemp[i]='6';
else if(a[i]=='P'||a[i]=='R'||a[i]=='S')
destemp[i]='7';
else if(a[i]=='T'||a[i]=='U'||a[i]=='V')
destemp[i]='8';
else if(a[i]=='W'||a[i]=='X'||a[i]=='Y')
destemp[i]='9';
else
destemp[i]=a[i];
}
}




int main ()


{
int n;
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)

{

scanf("%s",oritemp);
collect(oritemp);
convert(midtemp);
sscanf(destemp,"%d",&phonenum[i]);

}
sort(phonenum+1,phonenum+1+n);
int flag=0;
int pos=0;
for(i=1;i<=n;i++)

{
if(i==1)

{
pos++;
record[pos].data=phonenum[i];
record[pos].num++;
}

else if(phonenum[i]==phonenum[i-1])

{

record[pos].num++;
flag=1;
}
else

{

pos++;
record[pos].data=phonenum[i];
record[pos].num++;
}


}

if(flag==0)
printf("No duplicates. \n");
else if(flag==1)
for(i=1;i<=pos;i++)

{
if(record[i].num!=1)

{
char temp[200];
sprintf(temp,"%07d",record[i].data);
int j;
int flag=0;
for(j=0;j<strlen(temp);j++)

{
if(j==3&&flag==0)

{
printf("-");
flag=1;
}
printf("%c",temp[j]);
}
printf(" %d\n",record[i].num);
}
}
return 0;
}
