http://poj.org/problem?id=1002

题意:是说很多公司用了容易记住的电话号码,例如有英文字母的或者是用了很多连字符或没有连字符的。每个电话号码都有标准模式,而为了统计有没有重复的电话号码,就要统计有多少的电话号码是重复的,只要是有重复的就输出他的标准模式,如果所有的字符串都没有重复的,就输出No duplicates.

思路:这个题就用了普通的枚举,用的是cin输入的,结果是超时了,后来改成scanf就A了。这个题还可以用map去做,以及在排序的时候转换成整型会省更多的时间,后两种方法,第一种方法用时1454ms,第三种方法用时574ms,至于map我还没写,夜实在是深了,我先睡了,明天去做一下 。

普通方法

#include<iostream>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<algorithm>

using namespace std ;

char a[] = "22233344455566670778889990";
char ch[80] ,sh[100000][80];
int n ,j;

int cmp(const void *b,const void *c)
{
    return strcmp((char *)b,(char *)c) ;
}
void cuizhehundan()
{
    int len = strlen(ch) ;
    int flag = 0 ;
    for(int i = 0 ; i < len ; i++)
    {
        if(ch[i] >= '0'&&ch[i] <= '9')
            sh[j][flag++] = ch[i] ;
        if(ch[i] == '-'||ch[i] == 'Q'||ch[i] == 'Z')
            continue ;
        if(ch[i] >= 'A'&&ch[i] < 'Z')
            sh[j][flag++] = a[ch[i]-'A'];
    }
    sh[j][flag] = '\0' ;
    //cout<<sh[j]<<endl;
}

int main()
{
    int n ;
    cin>>n ;
    for(j = 0 ; j < n ; j++)
    {
        scanf("%s",ch) ;
        cuizhehundan();
    }
    qsort(sh,n,sizeof(sh[0]),cmp) ;
    int mark = 0 ;
    for(int i = 0 ; i < n-1 ; i++)
    {
        int num = 1;
       // int x = i ;
        while(i < n-1 &&strcmp(sh[i],sh[i+1]) == 0)
        {
                num++ ;
                i++ ;
        }
        if(num > 1)
        {
            for(int h = 0 ; h < 3 ; h++)
                printf("%c",sh[i][h]);
            cout<<'-';
            for(int h = 3 ; h < 7; h++)
                printf("%c",sh[i][h]);
               // cout<<" ";
                printf(" %d\n",num) ;
            //cout<<num<<endl;
            mark = 1 ;
        }
        num = 1;
    }
    if(!mark)
    printf("No duplicates.\n");
    return 0 ;
}
View Code

转化整型

#include<iostream>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<algorithm>

using namespace std ;

char a[] = "22233344455566670778889990";
char ch[100000] ;
char sh[100000];
int n ,j;

void cuizhehundan()
{
    int len = strlen(ch) ;
    int flag = 0 ;
    for(int i = 0 ; i < len ; i++)
    {
        if(ch[i] >= '0'&&ch[i] <= '9')
            sh[flag++] = ch[i] ;
        if(ch[i] == '-'||ch[i] == 'Q'||ch[i] == 'Z')
            continue ;
        if(ch[i] >= 'A'&&ch[i] < 'Z')
            sh[flag++] = a[ch[i]-'A'];
    }
    sh[flag] = '\0' ;
//    for(int i = 0 ; i < len ; i++)
//    cout<<sh[i];
//    cout<<endl;
}

int main()
{
    int n ;
    cin>>n ;
    int shh[100000] ;
    for(j = 0 ; j < n ; j++)
    {
        scanf("%s",ch) ;
        cuizhehundan();
        shh[j] = atoi(sh) ;
    }
    sort(shh,shh+n) ;
    //qsort(sh,n,sizeof(sh[0]),cmp) ;
    int mark = 0 ;
    for(int i = 0 ; i < n-1 ; i++)
    {
        int num = 1;
       // int x = i ;
        while(i < n-1 &&shh[i]==shh[i+1])
        {
                num++ ;
                i++ ;
        }
        if(num > 1)
        {
            printf("%03d-%04d %d\n",shh[i]/10000,shh[i]%10000,num) ;
            mark = 1 ;
        }
        num = 1;
    }
    if(!mark)
    printf("No duplicates.\n");
    return 0 ;
}
View Code

说好的map做法,昨晚因为不舒服很早就睡了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#include<string>
#define maxn 1000
using namespace std;
char s1[maxn],s2[maxn];
char s3[]="2223334445556667Q77888999Z";
map<string, int>q;
void change(char s[])
{
    int k=strlen(s);
    int j=0;
    for(int i=0; i<k; i++)
    {
        if(s[i]!='Q'&&s[i]!='Z'&&s[i]!='-')
        {
            char c=s[i];
            if(s[i]>='A'&&s[i]<'Z')
            {
                c=s3[c-'A'];
            }
            if(j==3)
                s2[j++]='-';
            s2[j++]=c;
        }
    }
    s2[j]='\0';
    //printf("%s\n",s2);
    if(q.find(s2)==q.end())
        q[s2]=1;
    else
        q[s2]++;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s1);
        change(s1);
    }
    map<string,int>::iterator it=q.begin();
    bool flag=false;
    while(it!=q.end())
    {
        if(it->second>1)
        {
            flag=true;
            cout<<it->first<<" "<<it->second<<endl;
        }
        it++;
    }
    if(!flag) printf("No duplicates.\n");
    return 0;
}
View Code

 

posted on 2013-11-03 01:02  枫、  阅读(190)  评论(0编辑  收藏  举报