Poj--1002 (字符串处理)

2014-05-28 17:07:18

题目链接:http://poj.org/problem?id=1002

题意:给出一些strings,按照手机按键的规则将其转化,得到standard strings,按字典序将其输出,并输出出现次数(只1次的不输出)。题目不难,但要想到将不长的string转化成整数的思路,并且

在判断时  for(int j = i + 1; v[i] == v[j] && j < n; j++) 语句中v[i] == v[j]语句很重要,保证只遍历到最后一个相同的v[j],而不遍历全部,节省时间,防止超时。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

char s[20];
int v[1000005];
int    main(){

    int map[128];
    memset(v,0,sizeof(v));
    memset(map,0,sizeof(map));
    int n,len;
    //init
    map['A'] = map['B'] = map['C'] = 2;
    map['D'] = map['E'] = map['F'] = 3;
    map['G'] = map['H'] = map['I'] = 4;
    map['J'] = map['K'] = map['L'] = 5;
    map['M'] = map['N'] = map['O'] = 6;
    map['P'] = map['R'] = map['S'] = 7;
    map['T'] = map['U'] = map['V'] = 8;
    map['W'] = map['X'] = map['Y'] = 9;

    scanf("%d",&n);
    for(int i = 0; i < n; i++){
        scanf("%s",s);
        for(int j = 0; s[j] != '\0'; j++){
            if(s[j] >= 'A' && s[j] <= 'Z'){
                v[i] = v[i] * 10 + map[s[j]];
            }
            else if(s[j] >= '0' && s[j] <= '9'){
                v[i] = v[i] * 10 + s[j] - '0';
            }
        }
    }
    sort(v,v + n);
    int ok = 0;
    for(int i = 0 ; i < n; i++){
        int cnt = 0;
        for(int j = i + 1; v[i] == v[j] && j < n; j++){
                ++cnt;
        }
        if(cnt){
            ok = 1;
            printf("%03d-%04d %d\n",v[i] / 10000,v[i] % 10000,cnt + 1);
        }
        i += cnt;
    }
    if(!ok){
        printf("No duplicates.\n");
    }
    return 0;
}

 

 

posted @ 2014-05-28 17:17  Naturain  阅读(118)  评论(0)    收藏  举报