CSP 201903-3 损坏的RAID5

哎,这个题好难读,然后是要关闭流同步,不然就t了

#include<bits/stdc++.h>

using namespace std;
const int N=1010;
int n,s,l,m,s_size;
long long tot;
vector<uint8_t> disks[N];
set<int> contain;
uint8_t get(char c) {
    if (isdigit(c)) {
        return c - '0';
    } else {
        return c - 'A' + 10;
    }
}
void solve(long long rid) {
    int tid = rid / s;//条带编号
    int k = tid / (n - 1);//求出来k
    int disk_stor = (n - 1) - (k % n);
    int bg_idx = (disk_stor + 1) % n;//从哪个磁盘开始
    int td_id = k * (n - 1);//条带编号
    int los = 0;//缺失几个
    int tmp = 0;
    int tar_disk = (disk_stor + (tid % (n - 1)) + 1) % n;
    for (int i = 0; i < n; i++) {
        if (!contain.count(i)) {
            los++; tmp = i;
        }
    }
    if ((tmp == tar_disk && los > 1)) {
        cout << "-\n";
        return;
    }
    if (contain.count(tar_disk)) {
        string ret;
        int blk = (rid % s) + k * s;
        for (int i = blk * 4; i <=blk * 4 + 3; i++) {
            uint8_t bt = disks[tar_disk][i];
            uint8_t hi = (bt >> 4);
            uint8_t lo = (bt % 16);
            char h = hi >= 10 ? hi - 10 + 'A' : hi + '0';
            char l = lo >= 10 ? lo - 10 + 'A' : lo + '0';
            ret.push_back(h);
            ret.push_back(l);
        }
        cout << ret << '\n';
    } else {
        if (los >= 2) {
            cout << "-\n";
        } else {
            vector<uint8_t> res(4,0);
            int blk = (rid % s) + k * s;
            for (auto i : contain) {
                for (int j = blk * 4; j <= blk * 4+ 3; j++) {
                    res[j - blk * 4] ^= disks[i][j];
                }
            }
            string ret;
            for (int i = 0; i < 4; i++) {
                uint8_t bt = res[i];
                int hi = (bt >> 4);
                int lo = (bt % 16);
                char h = hi >= 10 ? hi - 10 + 'A' : hi + '0';
                char l = lo >= 10 ? lo - 10 + 'A' : lo + '0';
                ret.push_back(h);
                ret.push_back(l);
            }
            cout << ret << '\n';
        }
    }
}
int main()
{
    std::ios::sync_with_stdio(false);
    cin >> n >> s >> l;
    for (int i = 0; i < l; i++) {
        int num;
        string str;
        cin >> num;
        cin >> str;
        contain.insert(num);
        for (int j = 0; j < str.size(); j += 2) {
            uint8_t nm = ((get(str[j]) << 4) | get(str[j + 1]));
            disks[num].push_back(nm);
        }
        tot = disks[num].size() / 4 * (n - 1);
    }
    cin >> m;
    for (int i = 0; i < m; i++) {
        long long rid; cin >> rid;
        if (rid >= tot) {
            cout << "-\n";
            continue;
        }
        solve(rid);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值