UVa OJ 327

1、终于AC了~WA了快十次了。。。好吧我激动了~按照惯例,还是分点说一下得到的经验。

2、本题虽然在“二叉树”分类里,但我觉得逐字符处理更方便。注意原式中有好多空格,预处理的时候要消去。否则在判断加减号是否是前后缀的时候非常麻烦!!!

3、注意访问的时候不要越界,比如i=0时就不要访问a【i-1】,我就是因为这个错了一次。

4、注意“表达式的值”的定义。++a的值为2而a++的值为1。

5、如果还通不过的话,试一试a++---b这个表达式,应为0。

#include<cstdio>
#include<cctype>
#include<cstring>
int main(){
   //freopen("a.txt","r",stdin)
   char s[120],stemp[120];
   int a[27],vis[27];
   while(fgets(stemp,120,stdin)!=NULL){
       if(stemp[0]=='\n') break;
       int p=0,q=0;
       while(stemp[p]){
           if(stemp[p]==' ') p++;
           else{
             s[q++]=stemp[p];
             p++;
           }
       }
       int i=0,ans=0,flag=1;
       for(int i=1;i<=26;i++)
           a[i]=i;
       memset(vis,0,sizeof(vis));
       while(s[i]!='\n'){
           if(isspace(s[i])) i++;
           if(isalpha(s[i])) {ans+=flag?a[s[i]-'a'+1]:-a[s[i]-'a'+1];vis[s[i]-'a'+1]=1;}
           if(s[i]=='+'&&i){
              if(s[i-1]!='+'&&s[i+1]!='+'||i>=3&&isalpha(s[i-3])&&s[i-2]==s[i-1]||isalpha(s[i+3])&&s[i+1]==s[i+2]) flag=1;
              else if(isalpha(s[i-1])&&s[i+1]=='+') {a[s[i-1]-'a'+1]++;}
              else if(s[i-1]=='+'&&isalpha(s[i+1])) a[s[i+1]-'a'+1]++;
           }
           if(s[i]=='-'&&i){
              if(s[i-1]!='-'&&s[i+1]!='-'||i>=3&&isalpha(s[i-3])&&s[i-2]==s[i-1]||isalpha(s[i+3])&&s[i+1]==s[i+2]) flag=0;
              else if(isalpha(s[i-1])&&s[i+1]=='-') {a[s[i-1]-'a'+1]--;}
              else if(s[i-1]=='-'&&isalpha(s[i+1])) a[s[i+1]-'a'+1]--;
           }
           i++;
        }
        printf("Expression: %s",stemp);
        printf("    value = %d\n",ans);
        for(int i=1;i<=26;i++)
           if(vis[i])
             printf("    %c = %d\n",i+'a'-1,a[i]);
   }
   return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值