← Back to topics
Topic

CharSwap problem

drugsale
Can somebody help me, please?
My code for task "CharSwap" works on 19/20 test cases.
That 1 test case gets WA, i don't know why?

Here is my Pascal source code. I hope that my code
is understandable.


program charswap;
var a,b:array['a'..'z'] of longint;
i,j,z1,z2:char;
k,s,n:longint;
begin
for i:='a' to 'z' do begin
a[i]:=0; b[i]:=0;
end;

readln(n);
for k:=1 to n do begin
read(z1);
inc(a[z1]);
end;

readln;
for k:=1 to n do begin
read(z2);
inc(b[z2]);
end;

for i:='a' to 'z' do
for j:='a' to 'z' do
if a[i]=b[j] then begin
b[j]:=0;
break; end;

for i:='a' to 'z' do s:=s+b[i];

if s=0 then writeln('DA')
else writeln('NE');
end.
halil
I ja sam radio sa istom idejom i grešio. Mora voditi računa i o pozicijama. Probaj:
3
aab
bab

Pozdrav.
drugsale
Hvala.
Kako onda radi 19 primjera, a samo jedan pada na WA? Jedino ako nije zbog dva moguća rješenja, pa sam negdje i pogodio odgovor.

Pozdrav.
Dgleich
Probaj s indeksiranjem pozicija prema ascii vrijednostima...
halil
Sale, tvoj program daje rezlutat DA, a tacno je NE.
A, sto se tiče test primera, izgleda da se slučajno poklapaju reultati 19 primera. I nisu moguća dva rešenja (jedinstveno je). Samo jos obrati paznju i na pozicije u stringu. Cak će ti i resenje biti kraće.
Znači, u onom primeru koji sam ti poslao, 'a' se preslika u 'b' (prva pozicija) .
A ako te je ovaj zadatak dovoljno iznervirao, mogu ti poslati rešenje koje je jako slično tvom (mada si jako blizu).
drugsale
Hvala na pomoći. Probat ću se još malo nervirati, pa ako baš ne bude nikako išlo, onda se čujemo (halil).
halil
Još koji primer za bolje razumevanje zadatka:

3
aab
bba
Result = DA

3
aab
ccd
Result = DA

3
aab
abb
Result = NE
parkins
Moze li mi neko reci sta ne valja sa ovim kodom posto mi izbacuje sta treba kad ga testiram, a ne prolazi ni jedan test?
#include <stdio.h>
#include <stdlib.h> //a=97 z=122 brojslova[i]=brojslova['slova'-'a']
main(){
long n,i,j,n1=0,indda,indne=0,*brojslovaugornjem=NULL,*brojslovaudonjem=NULL;
char *gornji=NULL,*donji=NULL;
scanf("%ld",&n);
if (n==0) ;
else{
while (gornji==NULL){
gornji=calloc(n+1,sizeof(char));}
scanf("%s",gornji);
while (donji==NULL){
donji=calloc(n+1,sizeof(char));}
while (brojslovaugornjem==NULL){
brojslovaugornjem=calloc(26,sizeof(long));}
while (brojslovaudonjem==NULL){
brojslovaudonjem=calloc(26,sizeof(long));}

scanf("%s",donji);
for(i=0;i<n;i++) {
brojslovaugornjem[gornji[i]-'a']++;
brojslovaudonjem[donji[i]-'a']++;
}
}
for(i=0;i<n;i++){
if (!(brojslovaugornjem[gornji[i]-'a']==brojslovaudonjem[donji[i]-'a'])) {
printf("NE");
break;
}
}
if (i==n) printf("DA");
free(gornji),free(donji),free(brojslovaugornjem),free(brojslovaudonjem);
}
halil
Probaj:
3
aab
bab
Trebalo bi da NE, ovaj kod daje DA.

I probaj sa printf("DA\n") i printf("NE\n"); tj, na kraju najčešće treba \n.

Nije dovoljno samo da je broj odgovarajućih slova jednak, mora se voditi računa i o redosledu.
parkins
Novi kod. Ostalo je nekoliko testova gde puca na exit code is not zero. Pokusavam da uvidim gde bi program mogao da pukne u toku izvrsavanja
#include <stdio.h>
#include <stdlib.h> //a=97 z=122 brojslova[i]=brojslova['slova'-'a']
main(){
long n,i,j,n1=0,indda,indne=0,brojslovaugornjem[26],brojslovaudonjem[26];
char *gornji=NULL,*donji=NULL,*gornji1=NULL,*donji1=NULL;
scanf("%ld",&n);

if (n==0) ;
else{
while (gornji==NULL){
gornji=calloc(n+1,sizeof(char));
}
while (gornji1==NULL){
gornji1=calloc(n+1,sizeof(char));
}
scanf("%s",gornji);
while (donji==NULL){
donji=calloc(n+1,sizeof(char));
}
while (donji1==NULL){
donji1=calloc(n+1,sizeof(char));
}

for(i=0;i<26;i++){
brojslovaugornjem[i]=0,brojslovaudonjem[i]=0;
}
scanf("%s",donji);

for(i=0;i<n;i++){
if (gornji[i]!='9'){
gornji1[n1]=gornji[i];
donji1[n1]=donji[i];
n1++;
}else continue;
for(j=i+1;j<n;j++){
if(gornji1[n1-1]==gornji[j] && donji1[n1-1]==donji[j]){
gornji[j]='9';
donji[j]='9';
}
}
}
for(i=0;i<n1;i++) {
brojslovaugornjem[gornji1[i]-'a']++;
if (brojslovaugornjem[gornji1[i]-'a']>1) {
printf("NE\n");
exit(0);
}
brojslovaudonjem[donji1[i]-'a']++;
if (brojslovaudonjem[donji1[i]-'a']>1) {
printf("NE\n");
exit(0);
}
}
}
printf("DA\n");
free(gornji),free(donji),free(gornji1),free(donji1);
}
halil
Na kraju bi trebalo return 0; da možeš dalje da testiraš
parkins
Ovo je zavrsilo posao. Svi testovi su OK. Samo ne znam koja je funkcija ovog return 0. Ovo nisam ranije koristio dok sam pisao na C-u(zadnja tri meseca od kad ga ucim na faxu)
halil
Obavezno, jer to vraća informaciju sistemu da li je program abortovao.