zoukankan      html  css  js  c++  java
  • CCF CSP 201403-3 命令行选项

    思路:

    1.用数组存储某个字母是否应该带有参数、是否在格式字符串中出现过;
    2.用getline读取一行字符串,然后用stringstream来以空格为分割拆解字符串;
    3.每个字符串判断它是不是合法的,不合法就停止;合法的话判断它有没有参数,参数不合法就停止;
    4.用map存储每个选项和它带有的参数,没参数就用空的代替就好了,map会自动排序,最后按序输出即可;

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define p_b(a) push_back(a)
    #define rp(i,n) for(int i=0;i<n;i++)
    int alpha[26];//字母带参数为1 不带为-1 不存在为0
    map<string,string> mp;
    bool isLegalOption(string s){
    	if(s[0]!='-'||s.length()>2) return false;
    	int pos=s[1]-'a';
    	if((pos<0&&pos>25)||!alpha[pos]) return false;
    	return true;
    }
    bool isLegalPara(string s){
    	for(auto e:s){
    		if((!islower(e))&&(!isdigit(e))&&e!='-')
    			return false;
    	}
    	return true;
    }
    int main(){
    	string s;
    	cin>>s;
    	for(int i=0;i<s.length();i++){
    		if((i+1)<s.length()&&s[i+1]==':'){
    			alpha[s[i++]-'a']=1;
    		}else alpha[s[i]-'a']=-1;
    	}
    	int n,kase=1;
    	cin>>n;
    	getchar();
    	rp(i,n){
    		mp.clear();
    		string line,item;
    		getline(cin,line);
    		stringstream ss(line);
    		vector<string> v;
    		while(ss>>item) v.p_b(item);
    		cout<<"Case "<<kase++<<":";
    		for(int j=1;j<v.size();j++){	//cout<<v[j]<<"***
    ";	
    			if(!isLegalOption(v[j])) break;
    			if(alpha[v[j][1]-'a']==1){
    				if((j+1)>=v.size()||!isLegalPara(v[j+1])) break;
    				mp[v[j]]=v[j+1];
    				j++;
    			}else mp[v[j]]=" ";
    		}
    		for(auto e:mp){
    			cout<<' '<<e.first;
    			if(e.second!=" ") cout<<' '<<e.second;
    		}
    		putchar('
    ');
    	}
    	return 0;
    }
    
  • 相关阅读:
    ASP.NET连接各种数据库办法
    随机生成中文验证码
    数据库进阶
    mysql数据库
    shell 系统学习
    redis 常见问题
    Linux下Nginx服务Rewrite和Proxy_Pass
    python 开发之路(2)
    shell 基础及提高
    mysql数据库和表物理内存
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308921.html
Copyright © 2011-2022 走看看