zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    .NET应用架构设计—表模块模式与事务脚本模式的代码编写
    .NET应用架构设计—重新认识分层架构(现代企业级应用分层架构核心设计要素)
    .NET应用架构设计—面向对象分析与设计四色原型模式(彩色建模、领域无关模型)(概念版)
    .NET应用架构设计—服务端开发多线程使用小结(多线程使用常识)
    .NET系列文章——近一年文章分类整理,方便各位博友们查询学习
    .NET应用架构设计—面向查询的领域驱动设计实践(调整传统三层架构,外加维护型的业务开关)
    .NET应用架构设计—面向查询服务的参数化查询设计(分解业务点,单独配置各自的数据查询契约)
    .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)
    .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(三)
    .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)
  • 原文地址:https://www.cnblogs.com/weilinfox/p/13508633.html
Copyright © 2011-2022 走看看