fork 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.  
  19.  
  20. Procedure scambia (var a,b: longint);
  21. var x:longint;
  22. begin
  23. x:=a;
  24. a:=b;
  25. b:=x;
  26. end;
  27. Procedure ordinamento (estremoi,estremos: longint; var v : elenco; ordinato:boolean);
  28. var inf, sup, medio:longint;
  29. pivot :longint;
  30. begin
  31. inf:=estremoi;
  32. sup:=estremos;
  33. medio:= (estremoi+estremos) div 2;
  34. pivot:=v[medio];
  35. repeat
  36. if (ordinato) then
  37. begin
  38. while (v[inf]>pivot) do inf:=inf+1;
  39. while (v[sup]<pivot) do sup:=sup-1;
  40. end;
  41. if inf<=sup then
  42. begin
  43. scambia(v[inf],v[sup]);
  44. inf:=inf+1;
  45. sup:=sup-1;
  46. end;
  47. until inf>sup;
  48. if (estremoi<sup) then ordinamento(estremoi,sup,v,ordinato);
  49. if (inf<estremos) then ordinamento(inf,estremos,v,ordinato);
  50. end;
  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 ((C[i]='.') and (C[i+1]='-') and (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.  
  82.  
  83. end;
  84. if N<=10 then begin
  85. maxextratime:=0;blokrimanenti:=0;
  86. for i:=1 to blocco do calcolatempo(branco[i],tempobranco[i]);
  87. ordinamento (1,N,tempobranco,true);
  88. for i:=1 to blocco do begin blokrimanenti:=blocco-i; if (blokrimanenti-(tempobranco[i]-1))<0 then extratime[i]:=abs(blokrimanenti-(tempobranco[i]-1))
  89. else extratime[i]:=0;
  90. end;
  91. for i:=1 to blocco do if extratime[i]>maxextratime then maxextratime :=extratime[i];
  92. W:=blocco;
  93. if blocco=1 then S:=tempobranco[1]
  94. else if maxextratime<>0 then S:=blocco+maxextratime
  95. else if tempobranco[1]>blocco then S:=tempobranco[1]
  96. else begin if singolo=0 then S:=blocco+1
  97. else S:=blocco;
  98. end;
  99.  
  100. end
  101. else
  102. begin
  103. maxtempo:=0;
  104. for i:=1 to blocco do begin calcolatempo(branco[i],tempobranco[i]); if tempobranco[i]>maxtempo then maxtempo:= tempobranco[i]; end;
  105. W:=blocco;
  106. if blocco=1 then S:=tempobranco[1]
  107. else if maxtempo>blocco then S:=maxtempo
  108. else begin if singolo=0 then S:=blocco+1
  109. else S:=blocco;
  110. end;
  111. end; end;
  112. WriteLn(W, ' ', S);
  113.  
  114. end;
  115. end.
  116.  
Success #stdin #stdout 0s 5284KB
stdin
Standard input is empty
stdout
Standard output is empty