1 solutions

  • 0
    @ 2025-6-4 10:16:31

    上古时期的T3确实好写一些,按照题意模拟即可,需要注意的是题目中选项参数字符串的定义为小写字母、数字和减号

    同时需要注意的是,选项的参数开头也可以是减号,可以参考这个例子:

    a:bc:d
    1
    ls -a -a -a -b -b
    Case 1: -a -b -b
    

    (鄙人陋习,竞赛代码不空格) 代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    char s[1010],c[1010],w[1010];
    char a[30][1010];
    bool ex[30];
    int type[30];
    int n,len;
    inline int islegal(char c) {
    	return isdigit(c)||islower(c)||c=='-';
    } 
    int main() {
    	scanf("%s",c+1);len=strlen(c+1);
    	for(int i=1;i<=len;i++) {
    		if(isalpha(c[i])) {
    			type[c[i]-'a']=1;
    			if(i+1<=len&&c[i+1]==':') type[c[i]-'a']=2;
    		}
    	}
    	scanf("%d ",&n);
    	int cnt=0;
    	while(n--) {
    		fgets(s,1010,stdin);len=strlen(s);
    		int p=0;
    		while(p<len&&s[p]!=' ') p++;
    		for(int i=0;i<26;i++) ex[i]=0;
    		while(p<len&&s[p]!='\n') {
    			//确定是选项 
    			if(p+1<len&&s[p]=='-'&&isalpha(s[p+1])) {
    				int op=s[p+1]-'a';
    				if(!type[op]) break;
    				//选项-a后不能有其他非空字符 
    				if(islegal(s[p+2])) break;
    				p+=2;
    				if(type[op]==1) {
    					ex[op]=1;
    				}
    				else {
    					int idx=0;
    					while(p<len&&!islegal(s[p])) p++;
    					if(p>=len||!islegal(s[p])) break;
    					ex[op]=1;
    					while(p<len&&islegal(s[p]))
    						a[op][idx++]=s[p++];
    					a[op][idx]='\0';
    				}
    			}
    			else {
    				if(s[p]!=' ') break;
    				p++;
    			}
    		}
    		printf("Case %d: ",++cnt);
    		for(int i=0;i<26;i++) {
    			if(!ex[i]) continue;
    			printf("-%c ",i+'a');
    			if(type[i]==2) {
    				printf("%s ",a[i]);
    			}
    		}
    		puts("");
    	}
    	return 0;
    }
    
    • 1

    Information

    ID
    5
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    2
    Tags
    # Submissions
    9
    Accepted
    5
    Uploaded By