← Back to topics
Topic

CharSwap problem

d
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.
h
halil
I ja sam radio sa istom idejom i grešio. Mora voditi računa i o pozicijama. Probaj:
3
aab
bab

Pozdrav.
d
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.
D
Dgleich
Probaj s indeksiranjem pozicija prema ascii vrijednostima...
h
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).
d
drugsale
Hvala na pomoći. Probat ću se još malo nervirati, pa ako baš ne bude nikako išlo, onda se čujemo (halil).
h
halil
Još koji primer za bolje razumevanje zadatka:

3
aab
bba
Result = DA

3
aab
ccd
Result = DA

3
aab
abb
Result = NE
p
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);
}
h
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.
p
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);
}
h
halil
Na kraju bi trebalo return 0; da možeš dalje da testiraš
p
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)
h
halil
Obavezno, jer to vraća informaciju sistemu da li je program abortovao.