题目链接:传送门(201403-3)
题意:
首先给你一个字符串说明哪些字母后面可以代参数,哪些不需要参数。然后给你n个字符串,将每个字符串中的参数解析出来。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
string s;
int n,vis[30],cnt;s
struct node{
char key;
bool flag;
bool operator<(const node &rs)const{
return key<rs.key;
}
}A[260];
unordered_map<char,string>ump;
bool check(char fu){
if((fu>='a'&&fu<='z')||(fu>='0'&&fu<='9')||(fu=='-'))return true;
return false;
}
void deal(){ ///字符串处理函数
int i,j,lenS,tot,pos;
char fu;
string t;
lenS=s.size();i=0;
while(i<lenS&&(s[i]!=' '))i++;i++;
if(i>=lenS)return;
while(i<lenS){
tot=0;j=i;
while(j<lenS&&(s[j]!=' '))j++,tot++;
if(tot!=2)return;
if((s[i]=='-')&&(s[i+1]>='a'&&s[i+1]<='z'));
else return;
fu=s[i+1];pos=fu-'a'+1;
if(vis[pos]==-1)return;
if(vis[pos]==0){
A[1+cnt]={fu,0};i+=3;
if(ump.find(fu)==ump.end())cnt++;
ump[fu]="0";
continue;
}
A[cnt+1]={fu,1};
t="";j=i+3;tot=0;
while(j<lenS&&(s[j]!=' ')){
if(!check(s[j]))return;
tot++;t+=s[j];j++;
}
if(!tot)return;
if(ump.find(fu)==ump.end())cnt++;
ump[fu]=t;
i=j+1;
}
}
int main(){
int i,j,lenS,pos;
while(cin>>s){
cin>>n;getchar();
for (i=0;i<=26;i++)vis[i]=-1;
lenS=s.size();ump.clear();
for (i=0;i<lenS;){
pos=s[i]-'a'+1;
if(i+1<lenS&&(s[i+1]==':'))vis[pos]=1,i+=2;
else vis[pos]=0,i++;
}
for (i=1;i<=n;i++){
getline(cin,s);cnt=0;ump.clear();
deal();
printf("Case %d:",i);
if(!cnt){
printf("\n");continue;
}
sort(A+1,A+1+cnt);
for (j=1;j<=cnt;j++){
printf(" -%c",A[j].key);
if(A[j].flag)printf(" %s",ump[A[j].key].c_str());
}printf("\n");
}
}
return 0;
}