字符串处理

题目链接:传送门(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值