fork download
  1. program paradox;
  2. var n, i :integer;
  3. S: array[1..325] of string;
  4. A,B,SY: array [1..325] of char;
  5. nodo, gsize : array[1..26] of integer;
  6. lettere : array[1..27] of array of integer;
  7. recStack, visited : array [1..26] of boolean; (*visited[] per tenere traccia se un nodo è stato visitato; recStack[] per tenere traccia se un nodo è stato visitato*)
  8. risposta: string;
  9. ciclo : boolean;
  10.  
  11. function isCyclic (u :integer) : boolean;
  12. var v :integer;
  13. begin
  14. if recStack[u] then begin isCyclic:=true; ciclo:=true; exit; end; (*ciclo rilevato*)
  15. if visited[u] then isCyclic:=false; (*nessun ciclo attraverso questo vertice*)
  16. visited[u]:=true; (*Contrassegna u come visitato*)
  17. recStack[u]:=true; (*Aggiungere u allo stack di ricorsione*)
  18. if gsize[u]>0 then for v:=1 to gsize[u]+1 do if isCyclic(lettere[u][v]) then isCyclic:=true; (*Per ogni vicino v del vertice u chiama ricors dfs(v). Se la chiamata ricorsiva restituisce True, restituisce True(ciclo rilevato).*)
  19. recStack[u]:=false; (*Rimuovi u dallo stack di ricorsione*)
  20. isCyclic:=false; (*nessun ciclo rilevato tramite questo percorso*)
  21. end;
  22.  
  23. begin
  24. readln(N);
  25. for i:=1 to N do readln(S[i]);
  26. for i:=1 to N do begin A[i]:=S[i][1]; SY[i]:=S[i][3]; B[i]:=S[i][5];end;
  27. for i:=1 to 26 do visited[i]:=false;
  28. for i:=1 to 26 do recStack[i]:=false;
  29. for i:=1 to 27 do
  30. begin
  31. setlength(lettere[i],0);
  32. (* all’inizio, la lista di adiacenza del nodo i ha dimensione 0*)
  33. gsize[i] := 0;
  34.  
  35. end;
  36. for i:=1 to N do
  37. begin
  38. if SY[i]='<' then begin gsize[ord(A[i])-96]:=gsize[ord(A[i])-96]+1; setlength(lettere[ord(A[i])-96], gsize[ord(A[i])-96]); lettere[ord(A[i])-96][gsize[ord(A[i])-96]]:= ord(B[i])-96; end
  39. else if SY[i]='>' then begin gsize[ord(B[i])-96]:=gsize[ord(B[i])-96]+1; setlength(lettere[ord(B[i])-96], gsize[ord(B[i])-96]);lettere[ord(B[i])-96][gsize[ord(B[i])-96]]:= ord(A[i])-96; end;
  40. end;
  41. for i:=1 to 26 do nodo[i]:=0;
  42. for i:=1 to N do begin nodo[ord(A[i])-96]:=nodo[ord(A[i])-96]+1; nodo[ord(B[i])-96]:=nodo[ord(B[i])-96]+1; end;
  43. for i:=1 to 26 do
  44. if (nodo [i]<>0) then begin
  45. if (visited[i]=false) and (isCyclic(i)) then ciclo:=true
  46. else if (visited[i]=false) and (isCyclic(i)=false) then ciclo:=false; end;
  47. if ciclo=true then risposta:=':('
  48. else risposta:=':)';
  49. writeln(risposta);
  50. end.
Success #stdin #stdout 0s 5308KB
stdin
5
a > f
b > c
a < d
d < c
f < b


stdout
:)