• 【ccf-csp题解】第1次csp认证-第三题-命令行选项-题解


    题目描述

    思路讲解

    本题是一个简单的字符串模拟题,这种题目是csp认证第三题的常客

    大致思路是用两个bool数组记录某一个选项(0--25下标对应小写字母a--z),第一个数组中无参选项为true,第二个数组中有参选项为true,比如说假如st1[0]==false&&st2[0]==false,意思是下面的命令中不能出现-a的选项(包括有参和无参)

    对于每一个命令,首先进行字符串的分割,分割方式推荐使用stringstream技术,具体看下面的文章:

    stringstream基础使用(类型转换、分割字符串)

    分割之后遍历每一个连续字符串,排除不合法情况,把有参的选项的参数找到并记录,最后统一输出即可,详细看下面的代码和注释

    满分代码和注释

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. const int N=30;
    7. bool st1[N];//无参记录
    8. bool st2[N];//有参记录
    9. string ans[N];//每一个选项对应的参数
    10. int main()
    11. {
    12. string str;
    13. cin>>str;
    14. for(int i=0;ilength();i++)//预处理bool数组
    15. if(i+1length()&&str[i+1]==':')st2[str[i]-'a']=true,i++;
    16. else st1[str[i]-'a']=true;
    17. int n;
    18. cin>>n;
    19. getchar();//吸收回车,因为下面有getline
    20. for(int i=1;i<=n;i++)
    21. {
    22. getline(cin,str);
    23. printf("Case %d:",i);
    24. vectorsp;
    25. stringstream ss(str);
    26. while(ss>>str)sp.push_back(str);//分割字符串至vector中
    27. for(int j=0;j<26;j++)ans[j].clear();//清空每一个样例的答案
    28. for(int j=1;jsize();j++)
    29. {
    30. if(sp[j][0]!='-'||sp[j][1]<'a'||sp[j].length()!=2)break;//不符合选项的要求
    31. //sp[j][1]<'a'意思是第二位不是小写字母,因为数字和减号的ASCII码值均小于'a'
    32. int k=sp[j][1]-'a';
    33. if(st1[k])ans[k]='#';//随便的值,只要长度大于0就可以与没出现过的选项区分
    34. else if(st2[k]&&j+1size())j++,ans[k]=sp[j];
    35. else break;
    36. }
    37. for(int j=0;j<26;j++)
    38. {
    39. if(ans[j].size())
    40. {
    41. cout<<" -"<<(char)(j+'a');
    42. if(st2[j])cout<<" "<
    43. }
    44. }
    45. cout<
    46. }
    47. return 0;
    48. }

  • 相关阅读:
    Key Points Estimation and Point Instance
    Redis常见面试题(2022)
    C. Zero Path
    服务器数据恢复-RAID5中磁盘被踢导致阵列崩溃的服务器数据恢复案例
    Blender快捷键
    【day14】每日强训——计算日期到天数转换&幸运的袋子
    自己写了一个CM管理GBase数据库集群
    【Mysql】子查询
    RT201 国产PA射频功率放大器 兼容RFX2401C
    XML学习总结
  • 原文地址:https://blog.csdn.net/m0_63222058/article/details/132701232