玄学错误求调
查看原帖
玄学错误求调
765958
lottle1212楼主2024/5/4 22:21

Code

#include <iostream>
#include <map>
#include <vector>
#define ll long long
using namespace std;
const int N = 1e4 + 10;
map <string, int> type_id, mem_id, ele_id;
int type_idx, mem_idx, ele_idx, n[N], t[N]; ll bgn[N]; string type_name[N], mem_name[N], ele_name[N];
struct Mem { int name, type; ll memory; } ele[N];
struct Type { ll memory, ali; vector <Mem> mem; } type[N];
void new_type(string name, ll memory, int ali, vector <Mem> mem) {
    type_name[type_id[name] = ++ type_idx] = name;
    type[type_idx] = {memory, ali, mem};
}
int new_name(string name) {
    if (! mem_id[name]) { mem_name[++ mem_idx] = name; return mem_id[name] = mem_idx;}
    return mem_id[name];
}
void new_ele(string name, ll memory, int type) {
    ele_name[ele_id[name] = ++ ele_idx] = name;
    ele[ele_idx] = {ele_idx, type, memory};
}
int max(int x, int y) { return x > y ? x : y; }
signed main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//	freopen("P9754_14.in", "r", stdin);
//	freopen("P9754.out", "w", stdout);
    vector <Mem> Null_;
    new_type("byte", 1, 1, Null_); new_type("short", 2, 2, Null_); new_type("int", 4, 4, Null_), new_type("long", 8, 8, Null_);
    int T; cin >> T;
    while (T --) {
        int op; cin >> op;
        if (op == 1) {
        	string s, name, tmp; int ali = 0, k; ll res = 0; vector <Mem> mem;
        	cin >> s >> k;
        	for (int i = 1; i <= k; ++ i) {
        		cin >> tmp >> name;
        		t[i] = type_id[tmp], n[i] = new_name(name);
        		ali = max(ali, type[t[i]].ali), res = (res + type[t[i]].ali - 1) / type[t[i]].ali * type[t[i]].ali, mem.push_back({n[i], t[i], res}), res += type[t[i]].memory;
			}
			res = (res + ali - 1) / ali * ali;
			new_type(s, res, ali, mem);
			cout << res << ' ' << ali << '\n';
            
        }
		else if (op == 2) {
            string tmp, name;
            cin >> tmp >> name;
            int t = type_id[tmp]; ll res = (ele[ele_idx].memory + type[t].ali - 1) / type[t].ali * type[t].ali;
            cout << res << '\n';
            new_ele(name, res + type[t].memory, t), bgn[ele_idx] = res;
        }
		else if (op == 3) {
            string name;
            cin >> name; name += ".";
            int _ele, cnt = 0;
            for (int i = 0, p = -1; i < name.size(); ++ i)
                if (name[i] == '.') {
                    if (p == -1) _ele = ele_id[name.substr(0, i)];
                    else n[++ cnt] = mem_id[name.substr(p, i - p)];
                    p = i + 1;
                }
            ll _memory = bgn[_ele], _type = ele[_ele].type;
            for (int i = 1; i <= cnt; ++ i) {
                for (int j = 0; j < type[_type].mem.size(); ++ j)
                    if (type[_type].mem[j].name == n[i]) {
                        _memory += type[_type].mem[j].memory, _type = type[_type].mem[j].type;
                        break;
                    }
            }
            cout << _memory << '\n';
        } else {
        	int addr; bool flag = true; string tmp;
        	cin >> addr;
        	for (int i = 1; i <= ele_idx; ++ i)
				if (addr >= bgn[i] && addr < ele[i].memory) {
					tmp = ele_name[ele[i].name];
					addr -= bgn[i]; int _type = ele[i].type;
					while (_type > 4) {
						for (int j = type[_type].mem.size() - 1; j >= 0; -- j)
							if (addr >= type[_type].mem[j].memory) {
								tmp += "." + mem_name[type[_type].mem[j].name];
								addr -= type[_type].mem[j].memory;
								_type = type[_type].mem[j].type;
								break;
							}
					}
//					cout << bgn[i] << ' ' << addr << '\n';
					if (addr < type[_type].memory) flag = false;
					break;
				}
			if (flag) cout << "ERR\n";
			else cout << tmp << '\n';
        }
    }
	return 0;
}

玄学之处在于第十四个点前半部分没有问题,最后几个开始发癫:

Ans(最后部分):

bhqcpx.qr.pl.ypkovtbed.npx.sjyogyijx.kz.foucemjgeh.hxevx
bhqcpx.rovucw.ypkovtbed.xhsmznwue.agwi.nrywn.emcohch.qrfewdonmh.fpeicfecl
113225513360
27046617917992 8
ERR
14993066346360 8
307235288
73027761203480 8
113225900016
bhqcpx.agfy.xnfm.rkatflweqs.rtv.hvq.tibpzpe.txspje.gft
113225900816
970139136
970139136

Out:

bhqcpx.sbappkwxem.xecpwajh.vxczsrm.xgmhy.xx.imudvhcvt.xnfm.fvclurym
jfrmogf.scwtzj
jfrmogf.scwtzj
jfrmogf.scwtzj
jfrmogf.scwtzj
jfrmogf.scwtzj
jfrmogf.scwtzj
jfrmogf.scwtzj
jfrmogf.scwtzj
jfrmogf.scwtzj
jfrmogf.scwtzj
jfrmogf.scwtzj
jfrmogf.scwtzj

救救我

2024/5/4 22:21
加载中...