UVa509 - RAID!

本文详细解读了RAID校验技术,包括奇校验和偶校验原理,通过位运算实现数据校验,并优化了数据输出方式,采用十六进制简化存储。同时强调了编程优化的重要性,鼓励开发者追求更高效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<bits/stdc++.h>
using namespace std;
int d, s, b, kase=0;
char type;
char tab[8][8000];
bool Fix(){
    for(int i=0;i<s*b;++i){
        int sum=0,cnt=0,x_no;
        for(int j=0;j<d;++j){
            if(tab[j][i]=='1') ++sum;
            if(tab[j][i]=='x') ++cnt,x_no=j;
        }
        sum%=2;
        if(cnt>=2) return false;
        else if(cnt == 1){
            if(sum)
                if(type=='E') tab[x_no][i]='1';
                else tab[x_no][i]='0';
            else
                if(type=='E') tab[x_no][i]='0';
                else tab[x_no][i]='1';
        }
        else if(cnt == 0){
            if(type == 'E'&& sum == 1) return false;
            if(type == 'O' && sum == 0) return false;
        }
    }
    return true;
}

void out_data()
{
    int sum=0,bit_cnt=0;
    for(int i=0;i<b;++i){
        int except =i%d;
        for(int j=0;j<d;j++){
            if(j==except) continue;
            for(int k=i*s;k<i*s+s;++k){
                bit_cnt=(bit_cnt+1)%4;
                if(tab[j][k]=='0') sum*=2;
                else sum=sum*2+1;
                if(!bit_cnt){
                    printf("%X",sum);
                    sum=0;
                }
            }
        }
    }
    if(bit_cnt){
        int over =4-bit_cnt;
        sum=sum*(1<<over);
        printf("%X",sum);
    }
    printf("\n");
}
int main()
{
    ios::sync_with_stdio(false);
    while(memset(tab,0,sizeof(tab)),cin>>d&&d){
        cin>>s>>b>>type;
        for(int i=0;i<d;++i)
            cin>>tab[i];
        if(!Fix())
            printf("Disk set %d is invalid.\n",++kase);
        else{
            printf("Disk set %d is valid, contents are: ",++kase);
            out_data();
        }
    }
    return 0;
}

今天看到一位学长写的博客,很受启发。要抛却功利心,形成自己的思维,不要老看题解,要追求多种方法,要优化自己的程序直到不能再优化,关注自己程序的运行时间和内存占用的排名。还有写题解不能只写两三句话就完事,要不然还不如不写。

这道RAID的题目,首先是位运算,实际上我的思路是看样例猜出来的,奇校验所有数字加起来为奇数,偶校验所有数字加起来为偶数,后来查阅资料:偶校验中当实际数据中“1”的个数为偶数的时候,这个校验位就是“0”,否则这个校验位就是“1”,奇校验正好相反,可知自己的猜想是正确的。

然后还有一点是输出数据的时候,4个bit转化为一个十六进制。刚开始做题认为每个数据块输出一个整数,这需要2^(5*64)这么大的数来存储,难道要用大整数类?后来一想,可以每一个十六进制位输出一次便可


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值