poj 1002 487-3279(参考YSQ)

题意:
输入n个字符串,每个字符串出去‘-’外只有7个字符,每个英文字母都有对应映射,请将输入字符串中标准电话号码出现次数大于1的输出
**Q与Z不会出现,so无map
于是构建映射^_^用map
首先解释公式 >o<:
x=x*10+(c-‘A’-(c>’Q’))/3+2
(c>’Q’)返回的是bool值1或0,于是如果输入字母为Q之后的字母向前移一位。
(c-‘A’-(c>’Q’))/3为什么要除以3呢(⊙o⊙)?
因为题目中三个字母对应一个映射
(c-‘A’-(c>’Q’))/3+2
为什么要+2呢 >o<
因为映射第一个数字是2

#include<cstdio>
#include<map>
using namespace std;
map <int,int> s;
int main(){
    int n;
    scanf("%d",&n);
    char c;
    //映射构建 
    for(int i=1;i<=n;i++){//n个字符串 
        int x=0;//x代表电话号码 
        for(int cnt=1;cnt<=7;){//每个字符串只有7个字符 
            scanf("%c",&c);
            if(c>='A'&&c<='Z'){//如果输入的是字母,进行转换 
                x=x*10+(c-'A'-(c>'Q'))/3+2;//(c>'Q)返回的是bool(1or0)
                cnt++;  
            } 
            else if(c>='0'&&c<='9'){
                x=x*10+c-'0'; 
                cnt++;
            }

        } 
        s[x]++;//电话号码对应映射+1 
    }
    bool visi=false;
    for(map<int,int>::iterator it=s.begin();it!=s.end();++it){//你写it++也无所谓啦
        if(it->second>1){
            printf("%03d-%04d %d\n",it->first/10000,it->first%10000,it->second);
            //%03d代表输出三个整数,不够补0
            visi=true; 
        }
    }
    if(visi==false)
        printf("No duplicates.\n");
    return 0;
}

你可能感兴趣的:(map,poj)