后缀表达读入提问
查看原帖
后缀表达读入提问
320309
KarL05楼主2020/11/11 18:33

在我的读入当中 我写一个readString()函数来读入字符串

string readString () {
    string s = "";
    char c = getchar();
    while (c==' '||c=='\n') c = getchar();
    while (c!=' '&&c!='\n') {
        s = s+c;
        c = getchar();
    }
    return s;
}

然后本地测试没问题 上去就挂掉了 改成

string readString () {
    string s;
    cin>>s;
    return s;
}

就好了 请问这是为甚么?

QWQ debug了很久 一直很疑惑

我的代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
#include<map>
#include<cstring>
using namespace std;

string readString () {
    string s;
    cin>>s;
    return s;
    // string s = "";
    // char c = getchar();
    // while (c==' '||c=='\n') c = getchar();
    // while (c!=' '&&c!='\n') {
    //     s = s+c;
    //     c = getchar();
    // }
    // return s;
}

int readInt () { 
	int x = 0;
	char c = getchar();
	while(c<'0'||c>'9'){
		c = getchar();
	}
	while(c>='0'&&c<='9'){
		x = x*10+c-'0';
		c = getchar();
	}
	return x;
}

int toInt (string in) {
    int res = 0;
    for (int i=0;i<in.size();i++) {
        res = res*10+in[i]-'0';
    }
    return res;
}

string toString (int in) {
    return to_string(in);
}

const int maxn = 2e6+5;
int e[maxn][2];
vector<string> buffer;
int n, root;
char opt[maxn];
int ans[maxn];
map<string,int> val;
map<string,int> pos;
int f[maxn];

bool isOp (string in) {
    if (in=="!"||in=="&"||in=="|") return true;
    return false;
}
void build () {
    stack<int> st;
    for (int i=0;i<buffer.size();i++) {
        string at = buffer[i];
        if (isOp(at)) {
            opt[i] = at[0];
            if (at=="!") {
                int a = st.top(); st.pop();
                e[i][1] = a;
            }
            else {
                int a = st.top(); st.pop();
                int b = st.top(); st.pop();
                e[i][0] = a;
                e[i][1] = b;
            }
        }
        st.push(i);
    }
}
void print (int at) {
    if (at==-1) return;
    cout<<"(";
    print(e[at][0]);
    cout<<buffer[at];
    print(e[at][1]);
    cout<<")";
}

void assigns (int at) {
    int lson = e[at][0];
    int rson = e[at][1];
    if (at==-1) return;
    if (lson==-1 && rson==-1) {
        f[at] = val[buffer[at]];
        return;
    }
    assigns(lson);
    assigns(rson);
    if (opt[at]=='|') {
        f[at] = f[lson]|f[rson];
    }
    if (opt[at]=='&') {
        f[at] = f[lson]&f[rson];
    }
    if (opt[at]=='!') {
        f[at] = !f[rson];
    }
}

void DFS (int at) {
    if (at==-1) return;
    int lson = e[at][0];
    int rson = e[at][1];
    if (lson==-1 && rson==-1) {
        ans[at] = 1;
        return;
    }
    if (opt[at]=='|') {
        if (f[at] != ((f[lson]^1)|f[rson])) {
            DFS(lson);
        }
        if (f[at] != (f[lson]|(f[rson]^1))) {
            DFS(rson);
        }
    }
    if (opt[at]=='&') {
        if (f[at] != ((f[lson]^1)&f[rson])) {
            DFS(lson);
        }
        if (f[at] != (f[lson]&(f[rson]^1))) {
            DFS(rson);
        }
    }
    if (opt[at]=='!') {
        DFS(rson);
    }
}
int main () {
    memset(e,-1,sizeof(e));
    string t = readString();
    while (toString(toInt(t))!=t) {
        buffer.push_back(t);
        t = readString();
    }
    n = toInt(t);
    for (int i=1;i<=n;i++) val["x"+to_string(i)] = readInt();
    for (int i=0;i<buffer.size();i++) pos[buffer[i]] = i;
    build();
    root = buffer.size()-1;
    assigns(root);
    DFS(root);   
    int q = readInt();
    for (int i=1;i<=q;i++) {
        int a = readInt();
        if (ans[pos[("x"+to_string(a))]]) printf("%d\n",!f[root]);
        else printf("%d\n",f[root]);
    } 
}
2020/11/11 18:33
加载中...