损坏的RAID5 第十六次CCF-CSP计算机软件能力认证

发布于:2025-06-09 ⋅ 阅读:(18) ⋅ 点赞:(0)

纯大模拟 提前打好板子 我只通过4个用例点 然后就超时了。
 

#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_map>
#include<bits/stdc++.h>
using namespace std;
int n, s, l;
unordered_map<int, string> ssd(103);
unordered_map<int, pair<int, int>> m;//(硬盘号,块号)
//编号到具体硬盘块的映射
//n:硬盘数目
//s:条带大小/块
//size:一个硬盘有多少个块
void change(int n,int s,int size) {
    //遍历
    int now = 0;
    int extra = n - 1;//冗余硬盘
    unordered_map<int, int> nums(n);//每个硬盘目前遍历到第几块硬盘
    //外循环:遍历条带
    for (int i = 0; i < (size / s); i++) {
        //内循环:遍历硬盘
        for (int j = (extra+1)%n; ; j=(j+1)%n) {
            if (j == extra) {nums[j]=nums[j]+s;break;}
            //遍历条带个数
            for (int k = 0; k < s; k++) {
                m[now++] = {j,nums[j]++};
            }
        }
        extra=(extra+n-1)%n;
    }
}
string get_string(int n,int k){
	return ssd[n].substr(k*8,8);
}
//一块4字节 8个字符
string work(int b) {
	if(b>=((ssd[0].size()/8 )/ s)*(n-1)*s)
		return "-";
	string s=get_string(m[b].first,m[b].second);
	return s;
	
	/*for(int i=0;i<((ssd[0].size()/8 )/ s)*(n-1)*s;i++){
		cout<<i<<" "<<m[i].first<<m[i].second<<endl;
	}
	return "";
	*/
	
}
int main()
{
    //n:硬盘数目
    //s:条带大小
    //l:现存硬盘数目
    cin >> n >> s >> l;
    while (l--) {
        int index;//硬盘的顺序号
        string s;//8的倍数的字符串
        cin >> index >> s;
        ssd[index] = s;
    }
    change(n, s, ssd[0].size()/8);
    int m;//读取操作个数
    cin>>m;
    while (m--) {
        int b;//读取块号
        cin>>b;
        cout<<work(b)<<endl;
    }
    return 0;
}