poj1002

Problem:487-3279
Description: 企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过拨打310-GINO来向Gino’s订一份pizza。让电话号码容易被记住的另一个办法是以一种好记的方式对号码的数字进行分组。通过拨打必胜客的“三个十”号码3-10-10-10,你可以从他们那里订pizza。

电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。电话拨号盘提供了从字母到数字的映射,映射关系如下:
A, B, 和C 映射到 2
D, E, 和F 映射到 3
G, H, 和I 映射到 4
J, K, 和L 映射到 5
M, N, 和O 映射到 6
P, R, 和S 映射到 7
T, U, 和V 映射到 8
W, X, 和Y 映射到 9

Q和Z没有映射到任何数字,连字符不需要拨号,可以任意添加和删除。 TUT-GLOP的标准格式是888-4567,310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。

如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)

你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是否有两个和多个公司拥有相同的电话号码。

Solution: 纯模拟题,作为一个渣渣,这题我还是花了蛮长的时间才AC的,而且看了别人的博客才只知道这题是可以用map处理的(虽然我现在还是不知道是什么鬼),反正我是水过去的。做完这个题吧,自己感觉对字符串要更熟悉了一点,而且也用到了许多自己平常不怎么样会用的东西,也深刻理解到了C的输入输出读取时间要比C++快啊!!!

Code(C++):

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
struct tag{
    string sr;
    int cn;
    }number[100050];
string s[100050];
int flag[100050],cnt[100050];
bool cmp(tag x,tag y)
{
    return (x.sr<y.sr);
}

bool cmp1(string s1,string s2)
{
    return s1<s2;
}

int main()
{
    int n,i,j,k=0,t=0,len;
    string str;
    char tmp[522];
    bool m=false;
    memset(flag,0,sizeof(flag));
    memset(cnt,0,sizeof(cnt));
    for(i=0;i<10000;i++)
        s[i]="";
    //cin>>n;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        //cin>>str;
        scanf("%s",tmp);
        str=tmp;
        len=str.length();
        for(j=0;j<len;j++)
        {
            if(str.at(j)=='1')
                s[i]+="1";
            if(str.at(j)=='0')
                s[i]+="0";
            if(str.at(j)=='A'||str.at(j)=='B'||str.at(j)=='C'||str.at(j)=='2')
                s[i]+="2";
            if(str.at(j)=='D'||str.at(j)=='E'||str.at(j)=='F'||str.at(j)=='3')
                s[i]+="3";
            if(str.at(j)=='G'||str.at(j)=='H'||str.at(j)=='I'||str.at(j)=='4')
                s[i]+="4";
            if(str.at(j)=='J'||str.at(j)=='K'||str.at(j)=='L'||str.at(j)=='5')
                s[i]+="5";
            if(str.at(j)=='M'||str.at(j)=='N'||str.at(j)=='O'||str.at(j)=='6')
                s[i]+="6";
            if(str.at(j)=='P'||str.at(j)=='R'||str.at(j)=='S'||str.at(j)=='7')
                s[i]+="7";
            if(str.at(j)=='T'||str.at(j)=='U'||str.at(j)=='V'||str.at(j)=='8')
                s[i]+="8";
            if(str.at(j)=='W'||str.at(j)=='X'||str.at(j)=='Y'||str.at(j)=='9')
                s[i]+="9";
            }
    }
    if(n==1)
        m=false;
    sort(s,s+n,cmp1);
    for(i=1;i<=n;i++)
    {
        if(s[i]==s[i-1])
            cnt[t]++;
        else
            t++;
    }
    for(i=0;i<n;i++)
        if(cnt[i]!=0)
        {
            m=true;
            break;
        }
    if(m==true)
    {
        number[k].sr=s[0];
        number[k].cn=cnt[k]+1;
        k++;
        for(i=1;i<n;i++)
            if(s[i]!=s[i-1])
            {
                number[k].sr=s[i];
                number[k].cn=cnt[k]+1;
                k++;
            }
            sort(number,number+k,cmp);
            for(i=0;i<k;i++)
            {
                if(number[i].cn!=1)
                {
                    number[i].sr.insert(3,"-");
                    printf("%s %d\n",number[i].sr.c_str(),number[i].cn);
                    //cout<<number[i].sr<<" "<<number[i].cn<<endl;
                }
            }
    }
    else if(m==false)
        printf("No duplicates. ");
        //cout<<"No duplicates. "<<endl;

    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值