• ICPC Yokohama 2018 A. Digits Are Not Just Characters


    Mr. Manuel Majorana Minore made a number of files with numbers in their names. He wants to have a list of the files, but the file listing command commonly used lists them in an order different from what he prefers, interpreting digit sequences in them as ASCII code sequences, not as numbers. For example, the files file10, file20 and file3 are listed in this order.Write a program which decides the orders of file names interpreting digit sequences as numeric values.Each file name consists of uppercase letters (from ‘A’ to ‘Z’), lowercase letters (from ‘a’ to ‘z’), and digits (from ‘0’ to ‘9’).A file name is looked upon as a sequence of items, each being either a letter or a number. Each single uppercase or lowercase letter forms a letter item. Each consecutive sequence of digits forms a number item.Two item are ordered as follows.

    • Number items come before letter items.
    • Two letter items are ordered by their ASCII codes.
    • Two number items are ordered by their values when interpreted as decimal

    numbers. Two file names are compared item by item, starting from the top, and the order of the first different corresponding items decides the order of the file names. If one of them, say A, has more items than the other, B, and all the items of B are the same as the corresponding items of A, B should come before.For example, three file names in Sample Input 1, file10, file20, and file3 all start with the same sequence of four letter items f, i, l, and e, followed by a number item, 10, 20, and 3, respectively. Comparing numeric values of these number items, they are ordered as file3 < file10 < file20.

    输入

    The input consists of a single test case of the following format.n s0 s1 . . . snThe integer n in the first line gives the number of file names (s1 through sn) to be compared with the file name given in the next line (s0). Here, n satisfies 1 ≤ n ≤ 1000. The following n + 1 lines are file names, s0 through sn, one in each line. They have at least one and no more than nine characters. Each of the characters is either an uppercase letter, a lowercase letter, or a digit.Sequences of digits in the file names never start with a digit zero (0).

    输出

    For each of the file names, s1 through sn, output one line with a character indicating whether it should come before s0 or not. The character should be “-” if it is to be listed before s0; otherwise, it should be “+”, including cases where two names are identical.

    样例输入1

    2 
    file10 
    file20 
    file3
    

    样例输出1

    +
    -
    

    样例输入2

    11 
    X52Y 
    X 
    X5 
    X52 
    X52Y 
    X52Y6 
    32 
    ABC 
    XYZ 
    x51y 
    X8Y 
    X222
    

    样例输出2

    -
    -
    -
    +
    +
    -
    -
    +
    +
    -
    +
    

    大意

    字符串拆分成段,排序先后取决于第一个不同的段,而和长度无关;同一位置数字和数字比,字母和字母比,不同则数字在字母前面。

    代码

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <cctype>
    
    using namespace std;
    
    typedef struct strs {
        string str; // origin string
        int sector[10]; // value of each sector
        int type[10]; // 0 digit 1 alpha
                      // digit appears before alpha
        int num; // sum of sectors
        strs () {}
        strs (string strt, int* sec, int* tp, int n):str(strt), num(n) {
            for (int i = 0; i < n; i++) {
                sector[i] = sec[i];
                type[i] = tp[i];
            }
        }
    } strstu;
    strstu s0;
    
    strstu getstr (string str) // cover string to strstu;
    {
        int sector[10] = {0};
        int type[10] = {0};
        int num = 0;
        for (int i = 0; i < str.length(); i++)
            if (isalpha(str[i])) {
                type[num] = 1;
                sector[num++] = int(str[i]);
            } else {
                int n = 0;
                for (int j = i; ; j++) {
                    if (isalpha(str[j]) || j == str.length()) {
                        sector[num++] = n;
                        i = j - 1;
                        //printf("%d ", n);
                        break;
                    }
                    n *= 10;
                    n += str[j] - '0';
                }
            }
        return strstu(str, sector, type, num);
    }
    
    bool judge (strstu str) //before s0 return true
    {
        int slen = str.num <= s0.num ? str.num : s0.num;
        int flag = 1;
        for (int i = 0; i < slen; i++) {
            if (s0.type[i] != str.type[i] || s0.sector[i] != str.sector[i])
                flag = 0;
            if (str.type[i] > s0.type[i]) return false;
            if (str.type[i] < s0.type[i]) return true;
            if (str.type[i] == s0.type[i] && str.sector[i] < s0.sector[i])
                return true;
            else if (str.type[i] == s0.type[i] && str.sector[i] > s0.sector[i])
                return false;
        }
    
        if (flag && str.num < s0.num) //shoter but have same header
            return true;
        
        return false;
    }
    
    int main()
    {
        int n;
        string s, t;
        cin >> n;
        cin >> s;
        
        s0 = getstr(s);
        
        while (n--) {
            cin >> t;
            if (judge(getstr(t))) printf("-
    ");
            else printf("+
    ");
        }
        
        return 0;
    }
    
  • 相关阅读:
    JAVA之代理2CGLib
    Java并发编程:Lock
    synchronized详解
    redis哨兵机制--配置文件sentinel.conf详解
    redis.conf讲解
    [Java并发包学习八]深度剖析ConcurrentHashMap
    [Java并发包学习七]解密ThreadLocal
    T和Class以及Class的理解
    python学习笔记十:异常
    python学习笔记九:正则表达式
  • 原文地址:https://www.cnblogs.com/weilinfox/p/13508633.html
Copyright © 2020-2023  润新知