在我的读入当中 我写一个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]);
}
}