Skip to content

Pro3

原始文件为 CPP 代码,本文是转换后的 Markdown 文件。

#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <vector>
#include <map>
#include <algorithm>
#include <stack>

using namespace std;

char hex_to_str[16];
int str_to_hex[100];


void init()
{
    for (int i = 0; i <= 9; ++i)
    {
        hex_to_str[i] = (i+'0');
        str_to_hex[i+'0'] = i;
    }   
    for (int i = 0; i < 6; ++i)
    {
        hex_to_str[i+10] = (i+'A');
        str_to_hex[i+'A'] = 10+i;
    }

}

void compute(string& str1,string& result)
{
    for (int i = 0; i < 8; ++i)
    {
        int ans = str_to_hex[str1[i]] ^ str_to_hex[result[i]];
        result[i] = hex_to_str[ans];
    }   
}

int main()
{
    ios::sync_with_stdio(false);
    const int maxn = 1005;
    string disk[maxn];
    bool disk_useful[maxn];
    memset(disk_useful,false,sizeof(disk_useful));

    freopen("in2.txt","r",stdin);

    uint32_t n,s,l; cin >> n >> s >> l;
    init();
    n = n - 1;
    uint32_t num = 0;
    for (uint32_t i = 0; i < l; ++i)
    {
        uint32_t index; cin >> index;
        disk_useful[index] = true;
        cin >> disk[index];     
        ++num;      
    }

    int m; cin >> m;
    for (int i = 0; i < m; ++i)
    {
        int index; cin >> index;

        int line = index/(n*s);
        int left = index%(n*s);
        int order = n - (line % (n+1));
        int diskindex = (order + left/s + 1) % (n+1);
        int bulkindex = line*s+left%s;

        if (diskindex > n || bulkindex*8 >= disk[diskindex].size())
        {
            cout << "-" << endl;
            continue;
        }

        if (disk_useful[diskindex])
        {
            cout << disk[diskindex].substr(bulkindex*8,8) << endl;
        }else
        {
            if (num < n) 
            {
                cout << "-" << endl;
                break;
            }
            string result = "00000000";
            bool flag = true;
            for (int i = 0; i <= n; ++i)
            {
                if (i == diskindex) continue;
                string test = disk[i].substr(8*bulkindex,8);
                compute(test,result);
            }

            if (flag)
            {
                cout << result << endl;
            }else
            {
                cout << "-" << endl;
            }
        }
    }
}