洛谷P2037 电话号码

P2037 电话号码

题目描述

一串由长长的数字组成的电话号码通常很难记忆。为了方便记忆,有种方法是用单词来方便记忆。例如用“Three Tens”来记忆电话3-10-10-10。

电话号码的标准形式是七位数字,中间用连字号分成前三个和后四个数字(例如:888-1200)。电话号码可以用字母来表示。以下是字母与数字的对应:

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。

如果两个电话号码的标准形式是一样的,那么这两个电话号码就是一样的。

现在有一本电话簿,请从中找出哪些电话号码是重复的。

输入输出格式

输入格式:

 

第一行一个正整数N,表示有多少个电话号码。

以下N行,每行一个电话号码,电话号码由数字、大写字母(除Q、Z)和连字符组成。电话号码长度不会超过1000。所有电话号码都合法。

 

输出格式:

 

将所有重复的电话号码按字典序以标准形式输出,并且在每个电话号码后跟一个整数,表示该电话号码共出现了多少次,电话号码和整数间用一个空格隔开。不要输出多余空行。

如果没有重复的电话号码,则输出:No duplicates.

 

输入输出样例

输入样例#1:
3
TUT-GLOP
3-10-10-10
310-1010
输出样例#1:
310-1010 2

说明

【数据范围】

对于30%的数据,N<=20。

对于50%的数据,N<=10000。

对于100%的数据,N<=100000。

#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 1000003
using namespace std;
int t[1000004],n;
long long map[1000005];
char s[1001];
void Hash(char ch[],int len){
    long long res=1,now=0;
    for(int i=1;i<=len;i++){
        if(ch[i]<='9'&&ch[i]>='0')res=(res*10+ch[i]-'0')%mod,now=now*10+ch[i]-'0';
        else{
            if(ch[i]<='C'&&ch[i]>='A')res=(res*10+2)%mod,now=now*10+2;
            if(ch[i]<='D'&&ch[i]>='F')res=(res*10+3)%mod,now=now*10+3;
            if(ch[i]<='G'&&ch[i]>='I')res=(res*10+4)%mod,now=now*10+4;
            if(ch[i]<='J'&&ch[i]>='L')res=(res*10+5)%mod,now=now*10+5;
            if(ch[i]<='M'&&ch[i]>='O')res=(res*10+6)%mod,now=now*10+6;
            if(ch[i]=='P'||ch[i]=='R'||ch[i]=='S')res=(res*10+7)%mod,now=now*10+7;
            if(ch[i]<='T'&&ch[i]>='V')res=(res*10+8)%mod,now=now*10+8;
            if(ch[i]<='W'&&ch[i]>='Y')res=(res*10+9)%mod,now=now*10+9;
        }
    }
    if(!t[res])map[res]=now;
    t[res]++;
}
void Print(int x){
    printf("%d-",map[x]/10000);
    printf("%d",map[x]%10000);
}
int main(){
    freopen("Cola.txt","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%s",s+1);
        int len=strlen(s+1);
        Hash(s,len);
    }
    for(int i=1;i<=1000003;i++){
        if(t[i]>1){
            Print(i);
            printf(" %d\n",t[i]);
        }
    }
    return 0;
}
10分 hash再次写炸,感觉整个人都不好了
/*
    以后不要逞强用hash了!就选stl map<string,int>
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,map[27]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9};
string s[100010],c;
int main(){
    freopen("Cola.txt","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>c;
        int len=c.length();
        for(int j=0;j<c.length();j++){
            if(c[j]=='-')continue;
            if(c[j]<='9'&&c[j]>='0')s[i]+=c[j];
            else s[i]+=map[c[j]-'A']+'0';
        }
    }
    int t=1;
    bool flag=0;
    sort(s+1,s+n+1);
    for(int i=1;i<=n+1;i++){
        if(s[i]!=s[i-1]){
            if(t>1)flag=1,cout<<s[i-1].substr(0,3)<<'-'<<s[i-1].substr(3,4)<<' '<<t<<endl;
            t=1;
        }
        else t++;
    }
    if(!flag)printf("No duplicates.");
    return 0;
}
100分 STL_map

 

posted @ 2017-09-25 14:53  Echo宝贝儿  阅读(423)  评论(0编辑  收藏  举报