【hdu 6342】Expression in Memories

【链接】 我是链接,点我呀:)
【题意】


在这里输入题意

【题解】


把所有的问号都改成'1'
然后会发现只有+0?这种情况
需要把?改成+.
看看这样的0后面的1是不是由问号改过来的就好了。是的话
再把这个1变成'+'就好。
判断一下首尾有符号的情况。
以及连续两个出现符号的情况。

【代码】

#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define lson l,mid,rt<<1
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define res(x) scanf("%s",x)
#define rson mid+1,r,rt<<1|1
using namespace std;

const double pi = acos(-1);
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};

const int N = 1e5;
bool flag[1000];
string s;

bool issign(char key){
    if (key=='+' || key=='*') return true;
    return false;
}

bool isnumber(char key){
    if (key>='0' && key<='9')
        return true;
    return false;
}

bool ok(){
    memset(flag,0,sizeof flag);
    int len = s.size();
    for (int i = 0;i < len;i++)
        if (s[i]=='?')
            flag[i] = 1;
    for (int i = 0;i < len;i++)
        if (s[i]=='?')
            s[i] = '1';
    for (int i = 0;i < len;i++){
        if (s[i]=='0' && (i==0 || !isnumber(s[i-1])) && i<len-1 && isnumber(s[i+1])){
            //s[i]是一个前导0
            if (!flag[i+1]) return false;
            s[i+1] = '+';
        }

    }
    if (issign(s[0]) || issign(s[len-1])) return false;
    for (int i = 0;i < len-1;i++)
        if (issign(s[i]) && issign(s[i+1]))
            return false;
    return true;
}

int main(){
    #ifdef LOCAL_DEFINE
            freopen("rush_in.txt", "r", stdin);
    //freopen("D:\\out.txt","w",stdout);
    #endif
    ios::sync_with_stdio(0),cin.tie(0);
    int T;
    cin >> T;
    while (T--){
        cin >> s;
        if (!ok()){
            cout<<"IMPOSSIBLE"<<endl;
        }else{
            cout<<s<<endl;
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/AWCXV/p/9403686.html
今日推荐