为啥第一个点在在线IDE上可过但评测机上不行?
查看原帖
为啥第一个点在在线IDE上可过但评测机上不行?
204109
Daniel1234楼主2023/11/30 21:58

RT

#include<bits/stdc++.h>
using namespace std;
int h;
string s;
map<int, string>mp;
unordered_map<string, int>bl;
set<int>st;
struct point{
    int op;
    int h;
    string p;
    int v;
    int nxt;
    int to;
}f[3005];
signed main(){
    while(getline(cin, s)){
        h = 0;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == ' '){
                mp[h] = s.substr(i + 1);
                st.insert(h);
                break;
            }
            h = h * 10 + s[i] - '0';
        }
    }
    for(auto to : mp){
        int h = to.first;
        string str = to.second;
        if(str[0] == 'E' && str[1] == 'N'){
            f[h].op = -1;
            continue;
        }
        f[h].nxt = *st.upper_bound(h);
        if(str[0] == 'I' && str[1] == 'F'){
            f[h].op = 0;
            for(int i = 3; i < str.size(); i++){
                if(str[i] == '='){
                    i++;
                    for(; i < str.size(); i++){
                        if(str[i] == 'G' && str[i + 1] == 'O'){
                            for(; i < str.size(); i++){
                                if('0' <= str[i] && str[i] <= '9'){
                                    f[h].to = f[h].to * 10 + str[i] - '0';
                                }
                            }
                        }
                        if('0' <= str[i] && str[i] <= '9')f[h].v = f[h].v * 10 + str[i] - '0';
                    }
                    break;
                }
                f[h].p += str[i];
            }
        }else if(str[0] == 'G' && str[1] == 'O'){
            f[h].op = 1;
            f[h].nxt = 0;
            for(int i = 0; i < str.size(); i++){
                if('0' <= str[i] && str[i] <= '9')f[h].nxt = f[h].nxt * 10 + str[i] - '0';
            }
        }else if(str[str.size() - 1] == '?'){
            f[h].op = 2;
        }else{
            f[h].op = 3;
            for(int i = 0; i < str.size(); i++){
                if(str[i] =='+'){
                    i++;
                    for(; i < str.size(); i++){
                        f[h].v = f[h].v * 10 + str[i] - '0';
                    }
                    break;
                }
                f[h].p += str[i];
            }
        }
    }
    int now = (*mp.begin()).first;
    int ans = 0;
    while(ans <= 1e7){
        ans++;
        if(f[now].op == -1){
            break;
        }
        if(f[now].op == 0){
            if(bl[f[now].p] == f[now].v)now = f[now].to;
            else now = f[now].nxt;
        }else if(f[now].op == 1){
            now = f[now].nxt;
        }else if(f[now].op == 2){
            now = f[now].nxt;
        }else if(f[now].op == 3){
            bl[f[now].p] += f[now].v;
            now = f[now].nxt;
        }
    }
    if(ans > 1e7)puts("-1");
    else cout << ans << endl;
    return 0;
}
10 A+1
20 IF A=5 GO 60
60 END
30 A+2
40 A?
50 GO 20
2023/11/30 21:58
加载中...