POJ 1002 487-3279(快排)

来源:互联网 发布:单片机数码管显示0到9 编辑:程序博客网 时间:2024/06/06 07:03

AC 397MS

题意:中文题就不说了

思路:可以考虑记录下所有的数,然后排序,再一起统计就可以了!需要注意的是电话号码输出是有前导0的,还有字符串的数组该开大一点

AC代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=100000+10;            char str[maxn];int a[maxn];int Map(char ch){if(ch=='A' || ch=='B' || ch=='C')return 2;else if(ch=='D' || ch=='E' || ch=='F')return 3;else if(ch=='G' || ch=='H' || ch=='I')return 4;else if(ch=='J' || ch=='K' || ch=='L')return 5;else if(ch=='M' || ch=='N' || ch=='O')return 6;else if(ch=='P' || ch=='R' || ch=='S')return 7;else if(ch=='T' || ch=='U' || ch=='V')return 8;else if(ch=='W' || ch=='X' || ch=='Y')return 9;    return 0;}struct node{    int num;    int tot;}ans[maxn];int main(){    #ifndef ONLINE_JUDGE    freopen("in.cpp","r",stdin);    #endif // ONLINE_JUDGE    int n;    scanf("%d",&n);    memset(a,0,sizeof(int)*(n+2));    for(int i=0;i<n;i++)    {        scanf("%s",str);        int len=strlen(str);        for(int j=0;j<len;j++)        {            int ok;            if(str[j]>='0'&&str[j]<='9')            {                ok=str[j]-'0';                a[i]=a[i]*10+ok;                continue;            }            ok=Map(str[j]);            if(ok!=0)            {                a[i]=a[i]*10+ok;            }        }        ans[i].tot=1;    }    sort(a,a+n);    int cnt=0;    for(int i=1;i<n;i++)    {        //printf("%d\n",a[i]);        if(a[i]==a[i-1])        {            ans[cnt].tot++;            if(i==n-1)                ans[cnt++].num=a[i];        }        else        {            ans[cnt++].num=a[i-1];        }    }    //printf("\n");    int flag=0;    for(int i=0;i<cnt;i++)    {        //printf("%d %d\n",ans[i].num,ans[i].tot);        if(ans[i].tot>=2)        {            flag++;            printf("%03d-%04d %d\n",ans[i].num/10000,ans[i].num%10000,ans[i].tot);        }    }    if(!flag)    {        printf("No duplicates.\n");    }    return 0;}


0 0
原创粉丝点击