POJ1002487-3279(map)

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

 

你可能感兴趣的:(map)