提交后得100分的C++程序如下:
#include<bits/stdc++.h> using namespace std; string str[1005]; int n,s,l,m,b; int band[1005];//保存每个磁盘的条带数 int getv(char a){ //把字符转化成数字 if(a>='0'&&a<='9') return a-'0'; else return a-'A'+10; } const string out="0123456789ABCDEF";//要输出的字符 int main(){ ios::sync_with_stdio(false);//关闭C++同步 cin>>n>>s>>l; int no; memset(band,0,sizeof(band)); for(int i=0;i<l;i++){ cin>>no; cin>>str[no]; band[no]=str[no].size()/8/s; } cin>>m; while(m--){ cin>>b; int rowp=b/s/(n-1);//与所查的块同行p的序号 int diskp=(n-1)-rowp%n;//同行p所在的磁盘 int blk=rowp*s+b%s; int dsk=(diskp+b/s-rowp*(n-1)+1)%n; if(rowp+1>band[dsk]&&band[dsk]!=0) { cout<<"-\n"; } else if(band[dsk]!=0) //存在直接读取 { cout<<str[dsk].substr(blk*8,8)<<endl; } else if(band[dsk]==0&&l>=n-1) //可以计算出来 { bool flag=0; for(int i=0;i<n;i++){ if(i==dsk) continue; if(band[i]<rowp+1) //其他盘有缺失 { cout<<"-\n"; flag=1; break; } } if(flag) continue; string ans="00000000",temp; for(int i=0;i<n;i++) { if(i==dsk) continue; temp=str[i].substr(blk*8,8); for(int j=0;j<8;j++) { ans[j]=out[getv(ans[j])^getv(temp[j])]; } } cout<<ans<<endl; } else cout<<"-\n"; } return 0; }
