https://ac.nowcoder.com/acm/contest/20104/B

思路

模拟即可,先枚举全是数字,没有符号的情况。再循环枚举加减号,枚举完再倒退再枚举一遍乘除号。枚举的同时sum++存储时间戳,a[i]=sum。最后再循环输出。(感觉自己的方法好复杂。。。)

code

#include<bits/stdc++.h>//万能头
using namespace std;
const int MAXN=1000005;//宏定义
char s[MAXN];//原字符串s
int a[MAXN];//存储时间戳的a数组
int n,sum=1;//时间戳sum从1开始
bool bj,flg;//俩标记
int main()
{
    scanf("%d",&n);//输入n
    scanf("%s",s+1);//输入s
    for(int i=1;i<=n;i++)
    {
        if(s[i]=='+'||s[i]=='-'||s[i]=='/'||s[i]=='*')
        {
            bj=true;
            break;
        }
    }//枚举有没有运算符号
    if(bj==false)//没有直接输出
    {
        printf("%s",s+1);
        return 0;
    }
    for(int i=1;i<=n;i++)//枚举
    {
        if(flg==true&&(s[i]=='+'||s[i]=='-'))//先枚一遍+-
        {
            a[i]=sum;//存时间戳
            sum++;//时间戳++
        }//这里flag=true代表是第一遍枚举
        if(flg==false&&(s[i]=='/'||s[i]=='*'))//再枚一遍/*
        {
            a[i]=sum;
            sum++;//同理
        }//flag==false是重来的那一遍
        if(i==n&&flg==false)//如果加减枚完了
        {
            i=1;//再枚一遍
            flg=true;//标记打上
        }
    }
    for(int i=1;i<=n;i++)//循环输出
    {
        if(s[i]!='+'&&s[i]!='-'&&s[i]!='/'&&s[i]!='*')//不是运算符号
        {
            printf("%c",s[i]);//直接输出
            continue;
        }
        printf("%c[%d]",s[i],a[i]);//打上时间戳输出
    }
    return 0;//结束
}

The End