fork download
  1. program paradox;
  2. Uses Math;
  3. var n, i, j, h, w, inizio, fine:integer;
  4. S: array[1..325] of string;
  5. A,B,SY: array [1..325] of char;
  6. nodo, nodi : array[1..26] of integer;
  7. lettere : array[1..26,1..26] of boolean;
  8. recStack, visited : array [1..26] of boolean;
  9. risposta: string;
  10. ciclo : boolean;
  11. graph : array[1..325] of array of integer;
  12. gsize, gcapa: array[1..325] of integer;
  13.  
  14.  
  15. function isCyclic (u :integer) : boolean;
  16. var v :integer;
  17. begin
  18. if recStack[u] then begin isCyclic:=true; ciclo:=true; exit; end;
  19. if visited[u] then isCyclic:=false;
  20. visited[u]:=true;
  21. recStack[u]:=true; writeln(u, ' ',gsize[u]);
  22. for v:=1 to gsize[u] do if isCyclic(v) then isCyclic:=true;
  23. recStack[u]:=false;
  24. isCyclic:=false;
  25. end;
  26.  
  27.  
  28.  
  29. begin
  30. readln(N);
  31. for i:=1 to N do readln(S[i]);
  32. for i:=1 to N do begin A[i]:=S[i][1]; SY[i]:=S[i][3]; B[i]:=S[i][5];end;
  33. for i:=1 to 26 do
  34. for j:=1 to 26 do lettere[i, j]:=false;
  35. for i:=1 to 26 do visited[i]:=false;
  36. for i:=1 to 26 do recStack[i]:=false;
  37. for i:=1 to 26 do nodi[i]:=0;
  38. for i:=1 to 26 do nodo[i]:=0;
  39. for w:=1 to 26 do
  40. begin
  41. setlength(graph[w], 1);
  42. gsize[w] := 0;
  43. gcapa[w] := 1;
  44. end;
  45. h:=1;
  46. for w:=1 to N do
  47. begin
  48. if SY[w]='<' then begin inizio := ord(A[w])-96; fine := ord(B[w])-96; nodo[inizio]:=nodo[inizio]+1; nodo[fine]:=nodo[fine]+1;end
  49. else if SY[w]='>' then begin inizio := ord(B[w])-96; fine := ord(A[w])-96; nodo[inizio]:=nodo[inizio]+1; nodo[fine]:=nodo[fine]+1;end;
  50. if gsize[inizio] = gcapa[inizio] then
  51. begin
  52. gcapa[inizio] := gcapa[inizio] shl 1;
  53. setlength(graph[inizio], gcapa[inizio]);
  54. end;
  55. graph[inizio][gsize[inizio]] := fine;
  56. inc(gsize[inizio]);
  57. end;
  58. h:=1;
  59. for i:=1 to 26 do if nodo[i]<>0 then begin nodi[h]:=i; h:=h+1;end;
  60. for i:=1 to h -1 do
  61. if (visited[nodi[i]]=false) and (isCyclic(nodi[i])) then ciclo:=true
  62. else if (visited[nodi[i]]=false) and (isCyclic(nodi[i])=false) then ciclo:=false;
  63.  
  64. if ciclo=true then risposta:=':('
  65. else risposta:=':)';
  66. writeln(risposta);
  67. end.
Success #stdin #stdout 0s 5320KB
stdin
3
a < b
b < c
a < c
stdout
1 2
2 1
3 0
:(