expression in Memories

传送门

题意:给你一个字符串,让你变为:数字+(×)+数字+(×)数字……

数字不能有前导零,开头或结尾不能有运算符

思路:先*0?-->*0+

            +0?-->+0+

            ?0-->+0

  其余?变为1

再判断是否有前导零、运算符相邻、开头或结尾有运算符的情况

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+5;
const ll mod = 1e9+7;
const ll INF = 0x3f3f3f3f;
char s[N];
int l;
int check()
{
    for(int i=1;i<l;i++)
    {
        if((s[i]=='+'||s[i]=='*')&&(s[i+1]=='+'||s[i+1]=='*'))
          return 0;
        if(s[i]=='0'&&(s[i+1]>='0'&&s[i+1]<='9')&&!(s[i-1]>='0'&&s[i-1]<='9'))
          return 0;
        if(s[1]=='+'||s[1]=='*'||s[l]=='+'||s[l]=='*')
          return 0;
    }
    return 1;
}
int main()
{
   int t,i,j;
   scanf("%d",&t);
   while(t--)
   {
       scanf(" %s",s+1);
       l=strlen(s+1);
       // 0?-->0+
       // *0?-->*0+
       // +0+-->+0+
       for(i=1;i<=l;i++)
       {
          if(s[i]=='0'&&!(s[i-1]>='0'&&s[i-1]<='9')&&s[i+1]=='?')
             s[i+1]='+';
          else if(s[i]=='?')
             s[i]='1';
       }
       if(check())
         puts(s+1);
       else
         puts("IMPOSSIBLE");
   }
   return 0;
}

猜你喜欢

转载自blog.csdn.net/AC_AC_/article/details/81353921