Now I’ve got the problem and solved it but The Judge says SIGABRT for some reason.
I guess it’s using a lot of memory but when I tested it in ideone it is showing memory usage in KBs.
So i couldn’t get any idea about the bug…
Here’s the code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
char *strrev(char *str){
char *p1, *p2;
if(!str || !*str)
return str;
for( p1 = str, p2 = strlen(str)+str-1; p1<p2; ++p1, --p2){
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
return str;
}
void append(char *s, char c){
int len = strlen(s);
s[len] = c;
s[len + 1] = '\0';
}
char *removeLeadingZeros(char *s){
char *tmp;
for(int i=0; i<strlen(s); i++){
if(s[i] != '0'){
tmp = s+i;
break;
}
}
return tmp;
}
void palin(char *s){
//printf("s: %s\n", s);
int midpoint = floor(strlen(s)/2);
char p[midpoint];
char q[midpoint];
int odd = strlen(s) % 2;
strncpy(p, s, midpoint);
p[midpoint] = '\0';
strcpy(q, s+midpoint+odd);
//printf("p: %s\tq: %s\n", p, q);
int i=midpoint-1, j=0;
do{
int a, b;
a = p[i];
b = q[j];
if(a == b){
i--;
j++;
continue;
}
if(a < b){
if(odd)
s[midpoint] += 1;
else
p[midpoint-1] += 1;
}
break;
}while(1);
char rev[strlen(p)];
strcpy(rev, p);
strrev(rev);
//printf("p: %s\nrev: %s\n", p, rev);
if(odd)
append(p, s[midpoint]);
//printf("p: %s\tq: %s\n", p, q);
strcat(p, rev);
printf("%s\n", p);
}
int main(){
int t;
scanf("%i", &t);
while(t--){
char s[1000000];
scanf("%s", s);
char *p;
p = removeLeadingZeros(s);
s[strlen(s) - 1] += 1;
palin(p);
}
return 0;
}
And let me know if I create a separate thread for this problem.