csp-s T3 结构体 考试写的大模拟,wa,得70,有兴趣的可以看看
  • 板块学术版
  • 楼主fattership
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/10/23 21:13
  • 上次更新2023/11/2 11:39:46
查看原帖
csp-s T3 结构体 考试写的大模拟,wa,得70,有兴趣的可以看看
384370
fattership楼主2023/10/23 21:13
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <queue>
#include <string>
#include <unordered_map>
#include <vector>

using namespace std;

// ifstream cin("struct.in");
// ofstream cout("struct.out");

struct struMember {
    string type, name;
    long long startit;
};

struct stru {
    string name;
    long long size;
    long long startit;
    int stdp;
    unordered_map<string, int> memberNameHash;
    vector<struMember> member;
};

struct gvar {
    string type, name;
    long long startit;
};

unordered_map<string, int> struNameHash;
vector<stru> struList;

unordered_map<string, int> gvarNameHash;
vector<gvar> ctx;

long long alignIt(int stdp, long long it) {
    int md = it % stdp;
    if (md == 0) {
        return it;
    }
    return it - md + stdp;
}

void printAllStru() {
    cout << "Struct Debug:" << endl;
    for (auto t : struList) {
        cout << "Struct name: " << t.name << ", size: " << t.size << ", stdp: " << t.stdp << endl;
        for (auto m : t.member) {
            cout << "    type: " << m.type << ", name: " << m.name << ", startit: " << m.startit << endl;
        }
    }
    cout << endl;
}

void init() {
    struNameHash.clear();
    struList.clear();

    gvarNameHash.clear();
    ctx.clear();

    stru tstru;

    tstru.name = "byte";
    tstru.size = 1;
    tstru.startit = 0;
    tstru.stdp = 1;
    tstru.member.clear();
    tstru.memberNameHash.clear();
    struNameHash[tstru.name] = struList.size();
    struList.push_back(tstru);

    tstru.name = "short";
    tstru.size = 2;
    tstru.startit = 0;
    tstru.stdp = 2;
    tstru.member.clear();
    tstru.memberNameHash.clear();
    struNameHash[tstru.name] = struList.size();
    struList.push_back(tstru);

    tstru.name = "int";
    tstru.size = 4;
    tstru.startit = 0;
    tstru.stdp = 4;
    tstru.member.clear();
    tstru.memberNameHash.clear();
    struNameHash[tstru.name] = struList.size();
    struList.push_back(tstru);

    tstru.name = "long";
    tstru.size = 8;
    tstru.startit = 0;
    tstru.stdp = 8;
    tstru.member.clear();
    tstru.memberNameHash.clear();
    struNameHash[tstru.name] = struList.size();
    struList.push_back(tstru);
}

void addStru() {
    int num;
    stru tstru;
    tstru.memberNameHash.clear();
    tstru.member.clear();
    tstru.startit = 0;
    tstru.size = 0;
    tstru.stdp = 0;

    cin >> tstru.name >> num;
    tstru.member.resize(num);
    for (int i = 0; i < num; i++) {
        cin >> tstru.member[i].type >> tstru.member[i].name;
        tstru.memberNameHash[tstru.member[i].name] = i;
        stru memberStru = struList[struNameHash[tstru.member[i].type]];

        tstru.member[i].startit = alignIt(memberStru.stdp, tstru.size);
        tstru.stdp = max(tstru.stdp, memberStru.stdp);
        tstru.size = tstru.member[i].startit + memberStru.size;
    }
    tstru.size = alignIt(tstru.stdp, tstru.size);
    struNameHash[tstru.name] = struList.size();
    struList.push_back(tstru);

    cout << tstru.size << " " << tstru.stdp << endl;
}

void addVar() {
    gvar tvar;
    cin >> tvar.type >> tvar.name;

    long long startit = 0;
    if (ctx.size() != 0) {
        startit = ctx.back().startit + struList[struNameHash[ctx.back().type]].size;
    }
    stru tstru = struList[struNameHash[tvar.type]];
    tvar.startit = alignIt(tstru.stdp, startit);
    gvarNameHash[tvar.name] = ctx.size();
    ctx.push_back(tvar);

    cout << tvar.startit << endl;
}

void findVar() {
    string path;
    queue<string> vars;
    while (!vars.empty()) {
        vars.pop();
    }

    cin >> path;
    // split
    for (int i = 0; i < path.size(); i++) {
        if (path[i] == '.') {
            vars.push(path.substr(0, i));
            path = path.substr(i + 1);
        }
    }
    vars.push(path);

    long long startit = ctx[gvarNameHash[vars.front()]].startit;

    stru tstru = struList[struNameHash[ctx[gvarNameHash[vars.front()]].type]];
    vars.pop();

    while (!vars.empty()) {
        struMember m = tstru.member[tstru.memberNameHash[vars.front()]];

        startit += m.startit;
        tstru = struList[struNameHash[m.type]];
        vars.pop();
    }

    cout << startit << endl;
}

// 原本准备用二分,但是费时间,就没写
void findMem() {
    long long beginit;
    string lastType = "";
    string path = "";
    cin >> beginit;

    stru tstru;
    bool finded = false;
    for (auto t : ctx) {
        if (t.startit <= beginit && beginit < t.startit + struList[struNameHash[t.type]].size) {
            path += t.name;
            beginit -= t.startit;
            tstru = struList[struNameHash[t.type]];
            finded = true;
            lastType = t.type;
            break;
        }
    }
    if (!finded) {
        cout << "ERR" << endl;
        return;
    }

    while (tstru.member.size() != 0) {
        finded = false;
        for (auto t : tstru.member) {
            if (t.startit <= beginit && beginit < t.startit + struList[struNameHash[t.type]].size) {
                path += "." + t.name;
                beginit -= t.startit;
                tstru = struList[struNameHash[t.type]];
                finded = true;
                lastType = t.type;
                break;
            }
        }
        if (!finded) {
            cout << "ERR" << endl;
            return;
        }
    }
    if (lastType != "byte" && lastType != "short" && lastType != "int" && lastType != "long") {
        cout << "ERR" << endl;
        return;
    }

    cout << path << endl;
}

int main() {
    init();
    int n;
    cin >> n;
    while (n--) {
        int t;
        cin >> t;
        if (t == 1) {
            addStru();
        } else if (t == 2) {
            addVar();
        } else if (t == 3) {
            findVar();
        } else {
            findMem();
        }
        // printAllStru();
    }
}

发现北京80中的考试没断网

2023/10/23 21:13
加载中...