hdu Problem K. Expression in Memories

              Problem K. Expression in Memories

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 262144/262144K (Java/Other)

Total Submission(s) : 1   Accepted Submission(s) : 1

Special Judge

Problem Description

Kazari remembered that she had an expression $s_0$ before.
Definition of expression is given below in Backus–Naur form.
::= |
::= "+" | "*"
::= "0" |
::= "" |
::= "0" |
::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
For example, `1*1+1`, `0+8+17` are valid expressions, while +1+1, +1*+1, 01+001 are not.
Though $s_0$ has been lost in the past few years, it is still in her memories. 
She remembers several corresponding characters while others are represented as question marks.
Could you help Kazari to find a possible valid expression $s_0$ according to her memories, represented as $s$, by replacing each question mark in $s$ with a character in 0123456789+* ?

 

 

Input

The first line of the input contains an integer $T$ denoting the number of test cases. Each test case consists of one line with a string $s$ $(1 \le |s| \le 500, \sum {|s|} \le 10 ^ 5)$. It is guaranteed that each character of $s$ will be in 0123456789+*? .

 

 

Output

For each test case, print a string $s_0$ representing a possible valid expression. If there are multiple answers, print any of them. If it is impossible to find such an expression, print IMPOSSIBLE.

 

 

Sample Input

 

5 ????? 0+0+0 ?+*?? ?0+?0 ?0+0?

 

 

Sample Output

 

11111 0+0+0 IMPOSSIBLE 10+10 IMPOSSIBLE

 

 

Source

2018 Multi-University Training Contest 4

思路:规则大概概括为:不能出现前导零,符号两边必须是合法数字。我们先把所有问号改好,再去判断现在是否合法,否则问题会变得很比不分开判断复杂。比如0?0判断到第2个0时你还要去看前一个?是什么。

下面的讲解问号只改为+或1...

对于(null)0?,+0?,*0?一律只能改为+,否则必是前导零,其他情况问号改为1,判断情况的时候注意一下i的范围

首位和最后一位不能是+/*,

1+0?,01,++/+*/**/*+,这些情况都不对

#include
using namespace std;
char a[101000];
int len;
int pd()
{
    int i;
    if(a[0]=='+'||a[0]=='*')
        return 0;
    if(a[len-1]=='+'||a[len-1]=='*')
     return 0;
    for(i=0;i='0'&&a[i+1]<='9')
                {
                    return 0;
                }
            }
        }
        if(i==0)
        {
            if(a[i]=='0')
            {
                if(a[i+1]>='0'&&a[i+1]<='9')
                {
                    return 0;
                }
            }
        }
    }
    return 1;
}
int main()
{
    int t;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        memset(a,0,sizeof(a));
        scanf("%s",a);
        len= strlen (a);
        if(a[0]=='0')
        {
            if(a[1]=='?')
            {
                a[1]='+';
            }
        }
        for(int i=1;i

 

你可能感兴趣的:(暑假集训)