首页 > 其他分享 >Day2 备战CCF-CSP练习

Day2 备战CCF-CSP练习

时间:2024-10-09 09:33:17浏览次数:1  
标签:选项 ops ++ res Day2 命令行 line CCF CSP

Day2

题目描述

请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。

每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。

这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。

在工具名字之后可能会包含若干选项,然后可能会包含一些不是选项的参数。

选项有两类:带参数的选项和不带参数的选项。

一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如 -a-b

而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。

该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。

这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。

如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。

例如,ab:m: 表示该程序接受三种选项,即 -a(不带参数),-b(带参数),以及 -m(带参数)。

命令行工具的作者准备了若干条命令行用以测试你的程序。

对于每个命令行,你的工具应当一直向后分析。

当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。

命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。

输入格式

输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 \(52\)

格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。

输入的第二行是一个正整数 \(N\),表示你需要处理的命令行的个数。

接下来有 \(N\) 行,每行是一个待处理的命令行,它包括不超过 \(256\)个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。

输出格式

输出有 \(N\) 行。其中第 \(i\) 行以 Case i:开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。

如果一个选项在命令行中出现了多次,只输出一次。

如果一个带参数的选项在命令行中出现了多次,只输出最后一次出现时所带的参数。

数据范围

\(1≤N≤20\)
对于每组数据,所有命令行工具的名字一定相同,且由小写字母构成。

输入样例:

albw:x
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l

输出样例:

Case 1: -a -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b

题目分析

模拟题 字符串处理
hash表映射记录带不带参数即可,字典序排列用map内部的默认排序即可,剩下的就是字符串分割处理,模仿python3 中的 split()函数实现字符串分割即可,然后参数一个个判断

C++代码

注意用C++17可以用auto [k , v] : map遍历
C++14不支持,只能auto pair : map 或者 for(map<string , string>::iterator it = map.begin() ; it != map.end() ; it ++)遍历

C++代码

C++14

#include <bits/stdc++.h>
using namespace std;

string op;
map<string , int> opera;

int n;
string line;


vector<string> substr(string line)
{
    vector<string> ans;
    for(int i = 0 ; i < line.size() ; i ++)
    {
        string word = "";
        while(i < line.size() && line[i] != ' ') word = word + line[i ++];
        ans.push_back(word);
    }
    return ans;
}

int main()
{
    cin >> op;
    cin >> n;
    for(int i = 0 ; i < op.size() ; i ++)
    {
        string res = "-" + op.substr(i , 1);
        if(op[i + 1] == ':')
            opera[res] = 1 , i ++;
        else opera[res] = 2;
    }
    getline(cin , line);
    for(int l = 1 ; l <= n ; l ++){
        getline(cin , line);
        vector<string> ops = substr(line);
        map<string , string> res;
        for(int i = 1 ; i < ops.size() ; i ++)
        {
            if(opera[ops[i]] == 0) break;
            else if(opera[ops[i]] == 2) res.insert({ops[i] , ""});
            else 
            {
                if(i + 1 >= ops.size()) break;
                res[ops[i]] = ops[i + 1] , i ++;
            }
        }
        cout << "Case " << l << ":";
        for(auto it : res)
            if(it.second != "") cout << " " << it.first << " " << it.second;
            else cout << " " << it.first;
        cout << endl;
    }
    return 0;
}

C++17

#include <bits/stdc++.h>
using namespace std;

string op;
map<string , int> opera;

int n;
string line;


vector<string> substr(string line)
{
    vector<string> ans;
    for(int i = 0 ; i < line.size() ; i ++)
    {
        string word = "";
        while(i < line.size() && line[i] != ' ') word = word + line[i ++];
        ans.push_back(word);
    }
    return ans;
}

int main()
{
    cin >> op;
    cin >> n;
    for(int i = 0 ; i < op.size() ; i ++)
    {
        string res = "-" + op.substr(i , 1);
        if(op[i + 1] == ':')
            opera[res] = 1 , i ++;
        else opera[res] = 2;
    }
    getline(cin , line);
    for(int l = 1 ; l <= n ; l ++){
        getline(cin , line);
        vector<string> ops = substr(line);
        map<string , string> res;
        for(int i = 1 ; i < ops.size() ; i ++)
        {
            if(opera[ops[i]] == 0) break;
            else if(opera[ops[i]] == 2) res.insert({ops[i] , ""});
            else 
            {
                if(i + 1 >= ops.size()) break;
                res[ops[i]] = ops[i + 1] , i ++;
            }
        }
        cout << "Case " << l << ":";
        for(auto [k , v] : res)
            if(v != "") cout << " " << k << " " << v;
            else cout << " " << k;
        cout << endl;
    }
    return 0;
}

标签:选项,ops,++,res,Day2,命令行,line,CCF,CSP
From: https://www.cnblogs.com/mathblog/p/18453572

相关文章

  • CSP2024-33
    2A题意:给定一个01串,每次可以循环移动一个子串,求多少次操作使整串有序(升序)。每次操作至多使极大全1段个数减一:111100001111\(\to\)000011111111。数一下一开始有多少全1段,判断一下最后一个元素是否是1即可。submissionA题意:给定\(n,m,a,b,k\),求满足\(ax+by=k,\x,......
  • CSP2024 前集训:csp-s模拟10
    前言T2赛时不会,T3没有想到移项遂打了个背包得\(50pts\),T4又放回滚莫队板子,结过开太晚了没打完,以后板子麻烦放靠前点谢谢。T1需要线性基思想,听5k讲完貌似懂了,但是学了再回来补吧。T2首先选择一个度数不是\(1\)的点当根。对于一个非叶子节点\(p\)被扫到有两种情况......
  • CSP 模拟 40
    A挤压看到异或首先拆位,看到统计期望的次幂考虑二项式定理或者组合意义。发现二项式定理不会,然后思考平方式子拆开,\(s_i\)表示\(2^i\),\(x^2=\sum_{i=1}s_i\sum_{j=1}s_j=\sum_{i=1}\sum_{j=1}s^{i+j}\),然后设\(f_{i,j,0/1,0/1}\)表示到当前数异或之后,第\(i\)位为\(0/1\),......
  • CCF--GESP复习资料(1级)
    CCF--GESP复习资料第一部分:计算机基础与编程环境计算机硬件主要由五大部分组成:运算器、储存器、控制器、输入设备、输出设备。第二部分:计算机历史计算机的诞生(1950年至今)1950年以后出现的计算机都差不多基于冯·诺依曼模型,它们变得更快、更小、更便宜,但原理几乎是相同的。......
  • [CSP-S 2019 江西] 网格图
    算法暴力建图直接跑Kruskal,显然能通过\(64pts\)的点正解分析Kruskal的复杂度发现比较边权非常的浪费,很显然是不必要的并查集求环路也浪费了网格图的性质考虑优化把每一条边看做一个整体,整体比较只需要\(O((n+m)\log(n+m))\)问题是这样比较之后正确性如......
  • 10.8 模拟赛(2023 CSP-S 十连测 #5)
    炼石计划10月28日CSP-S十连测#5【补题】-比赛-梦熊联盟(mna.wang)复盘T1秒了。30min。T2题目越短越难。但是链的是经典题目,写了。小样例太水,大样例太大,不方便猜结论。于是先写暴力然后自己造样例。模拟了五六组感觉可以按照lca的深度降序排序,然后能选就选。这......
  • CSP 模拟 38
    Ascoreandrank神秘贪心,如果全是正数,每当大于等于\(S\)时删除最大的最优。如果\(S\)是负数,删去所有大于等于的数就是答案。思考删除最大的为什么不对,会有这样的情况,一个负数很小,使得选择区间改变,导致维护的集合清空。这时可以选择拿正数来抵消负数。具体来说,当前\(sum\)......
  • csp-s 模拟 8
    csp-s模拟8T1scoreandrank特殊性质,题意转换妙妙题对于\(S\)小于等于\(0\)的情况答案显然是所有大于等于\(S\)的个数。现在讨论\(S\)大于\(0\)的情况。先对序列做一个前缀和,题目要求即是让所有值减去前缀最小值小于\(S\)考虑有一段连续正整数的和大于\(S\),则......
  • XYD1005CSPS
    T1传送门[最短路,二分答案]Description无向连通图,求出一个最小的\(x\),使得每两点之间存在一条路径可以划分成不超过\(k\)段路径,且每段路径长度不超过\(x\),只能从节点处切割,不能从边中间划分。\(n\le100\),无重边自环。Solution\(n\)非常小,又要考虑每两个点,自然想到全......
  • csp-s模拟10
    csp-s模拟10\(T1\)T3673.欧几里得的噩梦\(0pts\)部分分\(0\%\):状压加枚举子集。\(20\%\):线性基暴力做。正解\(T2\)T3672.清扫\(6pts\)原题:[AGC010C]Cleaning钦定根节点\(rt\)的度数\(\ge2\),所以需要特判\(n=2\)的情况。部分分未知\(pt......