纯大模拟 提前打好板子 我只通过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;
}