題目大意:這道題是中文的,題意就略了吧;
我的思路是:先把字符串里面的-過濾掉,然后再用轉(zhuǎn)換函數(shù),將字符映射到響應(yīng)的數(shù)字,然后排序,記錄,輸出結(jié)果;
開始我本來打算用map容器來做這個(gè)題的,可是discuss里面說這個(gè)方法容易超時(shí),所以最后還是選用了if語句,雖然長(zhǎng)一點(diǎn)但是保證效率,呵呵;
心得嘛,我發(fā)現(xiàn)百度上寫的那篇關(guān)于sscanf用法的文章有誤,我在這里給它修正一下,那里提到過周星星同學(xué)的用法,里面說用sscanf可以過濾的字符串中的指定內(nèi)容,其實(shí)并非如此;百度原文如下:
“4. 取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
結(jié)果為:123456abcdedf ”
實(shí)際上,如果你把大寫字母插入到數(shù)字和小寫字母之間時(shí),buf只能夠取到大寫字母前面部分的內(nèi)容;
如sscanf("12345BCDEFabcdedf", "%[1-9a-z]", buf);
在輸出buf的值,出來后應(yīng)該是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;
}
