I tested the sample input and the output was right on my machine.
Can someone kind help find my mistake or offer me some test i/o,plz?
Or someone can plz post your AC code so that i can learn from you?
I'm confused with this problem for a whole day.
Code: Select all
#include<stdio.h>
#include<string.h>
#define maxn 65000
#define maxd 8
char raid[maxd][maxn];
char data[maxn];
int check(int b,int s,int d,int parity){
for(int i=0;i<b;i++)
for(int j=0;j<s;j++){
int sum=0,tot=0;
for(int k=0;k<d;k++)
if(raid[k][s*i+j]=='x')
{if(k%d==i%d) return 0;
else tot++;}
else sum+=raid[k][s*i+j]-'0';
if(tot>1) return 0;
if(tot==0&&sum%2!=parity) return 0;
for(int k=0;k<d;k++)
if(raid[k][s*i+j]=='x'){
if(sum%2!=parity) raid[k][s*i+j]='1';
else raid[k][s*i+j]='0';
}
}
}
int main(){
#ifdef LOCAL
freopen("input.txt","r",stdin);
#endif
int d,s,b,kase=0;
while(scanf("%d%d%d\n",&d,&s,&b)==3&&d){
//INIT
memset(raid,'\0',sizeof(raid));
memset(data,'\0',sizeof(data));
int parity;
scanf("%c\n",&parity);
if(parity=='O') parity=1;
else parity=0;
for(int i=0;i<d;i++)
scanf("%s",raid[i]);
//CHECK
int valid=check(b,s,d,parity);
//OUTPUT
printf("Disk set %d is ",++kase);
if(valid){
printf("valid, contents are: ");
for(int i=0;i<b;i++)
for(int j=0;j<d;j++)
for(int k=0;k<s;k++){
//printf("\n %d %d\n",j%d,i%d);
if(j%d!=i%d) sprintf(data,"%s%c",data,raid[j][s*i+k]);}
while(strlen(data)%4) sprintf(data,"%s%c",data,'0');
for(int i=0;i<strlen(data)/4;i++){
int x=0;
for(int j=0;j<4;j++) x+=(data[i*4+3-j]-'0')<<j;
printf("%X",x);
}
printf("\n");
//printf("%s\n",data);
//for(int i=0;i<d;i++)
// printf("%s\n",raid[i]);
}else printf("invalid.\n");
}
return 0;
}