fork(1) download
  1. Program walrus;
  2. type elenco=array[1..300000] of longint;
  3. var
  4. N, S, T, W, test,i, singolo, blocco, totdormienti, maxtempo,maxextratime,blokrimanenti: LongInt;
  5. C : AnsiString;
  6. branco, tempobranco, extratime:elenco;
  7.  
  8. Procedure calcolatempo(B:longint; var tempo:longint) ;
  9. begin
  10. if B=1 then tempo:=1
  11. else if B=2 then tempo:=2
  12. else
  13. begin
  14. if B mod 2<>0 then tempo := (B-3) div 2 +2
  15. else tempo:= (B-3) div 2 +3;
  16. end;
  17. end;
  18. Procedure scambia (var a,b: longint);
  19. var x:longint;
  20. begin
  21. x:=a;
  22. a:=b;
  23. b:=x;
  24. end;
  25. Procedure ordinamento (estremoi,estremos: longint; var v : elenco; ordinato:boolean);
  26. var inf, sup, medio:longint;
  27. pivot :longint;
  28. begin
  29. inf:=estremoi;
  30. sup:=estremos;
  31. medio:= (estremoi+estremos) div 2;
  32. pivot:=v[medio];
  33. repeat
  34. if (ordinato) then
  35. begin
  36. while (v[inf]>pivot) do inf:=inf+1;
  37. while (v[sup]<pivot) do sup:=sup-1;
  38. end;
  39. if inf<=sup then
  40. begin
  41. scambia(v[inf],v[sup]);
  42. inf:=inf+1;
  43. sup:=sup-1;
  44. end;
  45. until inf>sup;
  46. if (estremoi<sup) then ordinamento(estremoi,sup,v,ordinato);
  47. if (inf<estremos) then ordinamento(inf,estremos,v,ordinato);
  48. end;
  49.  
  50.  
  51. begin
  52. (*assign(input, 'input.txt'); reset(input);
  53.   assign(output, 'output.txt'); rewrite(output);*)
  54. ReadLn(T);
  55. for test:=1 to T do begin
  56. ReadLn(N);
  57. ReadLn(C);
  58. if N=1 then begin W:=1; S:=1; end
  59. else begin
  60. W := 0;
  61. S := 0;
  62. singolo:=0;
  63. blocco:=0;
  64. totdormienti:=0;
  65. i:=1;
  66. while i<N do
  67. begin
  68. if (C[i]='-') and (i<>N-1) then i:=i+1
  69. else
  70. if (C[i]='-') and (i=N-1) and (C[i+1]='.') then begin singolo:=singolo+1;blocco:=blocco+1; totdormienti:=totdormienti+1; branco[blocco]:=totdormienti; i:=i+1; end
  71. else
  72. if (C[i]='-') and (i=N-1) and (C[i+1]='-') then i:=i+1
  73. else
  74. if (C[i]='.') and (C[i+1]='.') then begin if i=N-1 then begin blocco:=blocco+1; totdormienti:=totdormienti+2; branco[blocco]:=totdormienti; i:=i+1; end
  75. else begin i:=i+1; totdormienti:=totdormienti+1; end
  76. end
  77. else
  78. if ((C[i]='.') and (C[i-1]='-') and (C[i+1]='-')) or ((i=1) and (C[i]='.') and (C[i+1]='-')) then begin singolo:=singolo+1; blocco:=blocco+1;totdormienti:=totdormienti+1; branco[blocco]:=totdormienti; i:=i+1; totdormienti:=0;end
  79. else
  80. if (C[i]='.') and (C[i+1]='-') then begin blocco:=blocco+1;totdormienti:=totdormienti+1;branco[blocco]:=totdormienti; i:=i+1; totdormienti:=0; end;
  81. end;
  82. for i:=1 to blocco do calcolatempo(branco[i],tempobranco[i]);
  83. ordinamento (1,blocco,tempobranco,true);
  84. for i:=1 to blocco do
  85. begin
  86. extratime[i]:= (tempobranco[i]-1)-(blocco-i);
  87. if extratime[i]<0 then extratime[i]:=0;
  88. end;
  89. ordinamento (1,blocco,extratime,true);
  90. W:=blocco;
  91. S:=blocco+extratime[1];
  92. end;
  93. writeln(W,' ',S);
  94. end;
  95. end.
Success #stdin #stdout 0s 5288KB
stdin
1
6
.-...-
stdout
2 2