试题编号: 201903-3 试题名称: 损坏的RAID5

这题的数据未免也太水了,题目的意思好像默认是每块磁盘装载数据的长度是相等的。我写了判断每次取数据是否会超过每块磁盘存的数据的长度,然而并没有什么卵用。交上去20分,写了个数据测了下,如果要求的块太大的话,这样下面计算得出的对应磁盘号会太大,然后就会runtime error,所以求出最大块号,如果查询的块超过最大块号,就输出错误就可以了。

#include <bits/stdc++.h>
using namespace std;

int N,S,L,M;

long long number(char c)
{
    if (c>='0'&&c<='9') {
        return c-'0';
    }
    else {
        return 10+c-'A';
    }
}

long long getNum(string s)
{
    return number(s[0])*(long long)16+number(s[1]);
}

int main()
{
  //  freopen("in.txt","r",stdin);

    ios::sync_with_stdio(false);

//    string s;
//    cin>>s;
//    cout<<getNum(s)<<endl;;

    cin>>N>>S>>L;


    string disk[N];
    int num;
    int len;
    for (int i=0;i<L;i++) {
        cin>>num;
        cin>>disk[num];
        len=disk[num].length();
//        cout<<disk[num]<<endl;
    }

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

    N--;

    cin>>M;
    int query;
    for (int i=0;i<M;i++) {
        cin>>query;

        if (query<0||query>=maxid) {
            cout<<'-'<<endl;
            continue;
        }
        int floor=query/(N*S);
        int rem=query-floor*S*N;
        int mod=rem%S;
        int beg=floor*8*S+mod*8;

        int rescnt=rem/S+1;
        int resbeg=N-floor%(N+1);
        int resdisk=(resbeg+rescnt)%(N+1);

        if (disk[resdisk]=="") {

            if (L<N) {
                cout<<'-'<<endl;
                continue;
            }

            long long ans[10];
            memset(ans,0,sizeof(ans));

            bool flag=false;
            for (int i=0;i<=N;i++) {
                if (i!=resdisk) {
                    if (beg+8>disk[i].length()) {
                        flag=true;
                        break;
                    }
                    for (int j=0;j<4;j++) {
                        ans[j]=ans[j]^getNum(disk[i].substr(beg+j*2,2));
                    }
                }
            }

            if (flag) {
                cout<<'-'<<endl;
                continue;
            }

            for (int j=0;j<4;j++) {
//                printf("%02X",ans[j]);
                cout<<setiosflags(ios::uppercase)<<hex<<ans[j];
            }
            cout<<endl;
//            puts("");

        }
        else {
            string s=disk[resdisk].substr(beg,8);
            if (beg+8>disk[resdisk].length()) {
                cout<<'-'<<endl;
                continue;
            }
            cout<<s<<endl;
        }

    }
    return 0;
}
/**<

00010203
00010203
04050607
24252627

Process returned 0 (0x0)   execution time : 0.239 s
Press any key to continue.

3 2 2
0 000102030405060710111213141516172021222324252627
1 A0A1A2A3A4A5A6A7B0B1B2B3B4B5B6B7C0C1C2C3C4C5C6C7
2
2
5

2 1 2
0 000102030405060710111213141516172021222324252627
1 000102030405060710111213141516172021222324252627
2
0
1
*/

11 2 10
0 0001020304050607101112131415161720212223242526273031323334353637404142434445464750515253545556576061626364656667707172737475767780818283848586879091929394959697
1 0001020304050607101112131415161720212223242526273031323334353637404142434445464750515253545556576061626364656667707172737475767780818283848586879091929394959697
2 0001020304050607101112131415161720212223242526273031323334353637404142434445464750515253545556576061626364656667707172737475767780818283848586879091929394959697
3 0001020304050607101112131415161720212223242526273031323334353637404142434445464750515253545556576061626364656667707172737475767780818283848586879091929394959697
4 0001020304050607101112131415161720212223242526273031323334353637404142434445464750515253545556576061626364656667707172737475767780818283848586879091929394959697
5 0001020304050607101112131415161720212223242526273031323334353637404142434445464750515253545556576061626364656667707172737475767780818283848586879091929394959697
6 0001020304050607101112131415161720212223242526273031323334353637404142434445464750515253545556576061626364656667707172737475767780818283848586879091929394959697
7 0001020304050607101112131415161720212223242526273031323334353637404142434445464750515253545556576061626364656667707172737475767780818283848586879091929394959697
8 0001020304050607101112131415161720212223242526273031323334353637404142434445464750515253545556576061626364656667707172737475767780818283848586879091929394959697
9 0001020304050607101112131415161720212223242526273031323334353637404142434445464750515253545556576061626364656667707172737475767780818283848586879091929394959697
4
-1
10
15
1000
原文地址:https://www.cnblogs.com/xyqxyq/p/12328856.html