CCF201903-3 损坏的RAID5(100分)数学计算+文本处理

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF201903-3 损坏的RAID5(100分)数学计算+文本处理相关的知识,希望对你有一定的参考价值。

试题编号: 201903-3
试题名称: 损坏的RAID5
时间限制: 1.0s
内存限制: 512.0MB






问题链接CCF201903-3 损坏的RAID5
问题简述:(略)
问题分析:数学计算问题,涉及进制和位运算等。
程序说明:本程序由仙客传奇团队解题程序修改而成。
参考链接:(略)
题记:(略)

100分的C++语言程序如下:

/* CCF201903-3 损坏的RAID5 */

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
const int N = 1000;
string disk[N + 1];
bool vis[N + 1];

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(NULL);
    cout.tie(NULL);

    int n, s, l, no, len, m, bi;

    cin >> n >> s >> l;
    for (int i = 1; i <= l; i++) {
        cin >> no;
        cin >> disk[no];
        len = disk[no].size();
        vis[no] = true;
    }

    int maxid = ((len - 1) / 8 + 1) * (n - 1) - 1;

    cin >> m;
    while (m--) {
        cin >> bi;

        if (bi > maxid) cout << '-' << endl;
        else {
            int line = bi / ((n - 1) *s);
            int ppos = n - line % n - 1;
            int dskid = ppos + (bi - line * (n - 1) * s) / s + 1;
            if (dskid > n - 1) dskid -= n;
            if (vis[dskid]) {
                for (int i = 0; i < 8; i++)
                    cout << disk[dskid][(line * s + bi % s) * 8 + i];
                cout << endl;
            } else {
                if (n - l > 1) cout << '-' << endl;
                else {
                    LL p = 0;
                    for (int i = 0; i < n; i++) {
                        if (i != dskid) {
                            LL t = 0;
                            string ss(disk[i].begin() + (line * s + bi % s) * 8, disk[i].begin() + (line * s + bi % s + 1) * 8);
                            for (int j = 0; j < 8; j++) {
                                if (isdigit(ss[j]))
                                    t += LL(ss[j] - '0') << (4 * (8 - j - 1));
                                else
                                    t += LL(ss[j] - 'A' + 10) << (4 * (8 - j - 1));
                            }
                            p ^= t;
                        }

                    }
                    cout << setiosflags(ios::uppercase) << hex << p << endl;
                }
            }
        }
    }

    return 0;
}

以上是关于CCF201903-3 损坏的RAID5(100分)数学计算+文本处理的主要内容,如果未能解决你的问题,请参考以下文章

ccf 201903-3 损坏的RAID5

CCF认证历年试题

CCF201912-1 报数(100分)模拟

CCF201312-3 最大的矩形(100分)

CCF 201503-3 节日 100分

CCF 201503-3 节日 100分