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分)数学计算+文本处理的主要内容,如果未能解决你的问题,请参考以下文章