POJ 1002 487-3279

原题链接

题意:
给出一串格式十分恶心的电话号码,其中有数字也可能有字母,还可能有来捣乱的横杠(’ - ‘)。
现在要求你按照题目给出的字母映射方案对所有电话号码(100000级别)进行模式化,
然后统计每个模式化后的号码的出现次数,并将大于1的答案输出(格式请看样例),如果整个Case中没有一个合法的解,就输出下面这句话:

No duplicates. 

其他情况的输出格式:

xxx-xxxx m

310-1010 2
487-3279 4
888-4567 3

映射表:

A, B, and C map to 2
D, E, and F map to 3
G, H, and I map to 4
J, K, and L map to 5
M, N, and O map to 6
P, R, and S map to 7
T, U, and V map to 8
W, X, and Y map to 9 

思路的话,模式化就不用多说了,不过下面这个对于字母的映射公式真是不错:

x+=(c-'A'-(c>'Q'))/3+2

不懂不要紧,看到程序就明白了。
对于计数,模式化之后同一存成int整形,然后用map就可以搞定(虽然没什么优化,时间也是….,但代码真心简单啊,懒人请看)

代码实现

#include<map>
#include<cstdio>
std::map<int,int> dic;
int main(){
    int n,k=1,i,t,x;
    char c;
    scanf("%d",&n);
    for(i=0,t=0,x=0;i<n;i++,t=0,dic[x]++,x=0)
        while(t<7&&scanf("%c",&c)){
            if(c>='A'&&c<='Z')
                x=x*10+(c-'A'-(c>'Q'))/3+2,t++;
            else if(c>='0'&&c<='9')
                x=x*10+c-'0',t++;
        }
    for(std::map<int,int>::iterator it=dic.begin();it!=dic.end();++it)
        if(it->second>1)
            printf("%03d-%04d %d\n",it->first/10000,it->first%10000,it->second),k=0;
    if(k)   printf("No duplicates. ");
    return 0;
}

20Lines 求更短 (╬▔皿▔)凸

By YOUSIKI

你可能感兴趣的:(POJ 1002 487-3279)