Cod sursa(job #126433)

Utilizator juniorOvidiu Rosca junior Data 22 ianuarie 2008 03:59:32
Problema Restante Scor 90
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.62 kb
{ 90 p }
{ Iese din timp la un test. }

const
	lim = 36000;
var
	fi, fo : text;
  n, i, j, originale : longint;
  cuv : string[16];
  c : array[0..lim+1] of string[16];
  mc : array[#96..'z',1..lim] of string[16];
  nc, f : array[#96..'z'] of integer;
  car : char;
  l, k : byte;
begin
	assign(fi,'restante.in'); reset(fi);
  assign(fo,'restante.out'); rewrite(fo);
  readln(fi,n);
  for i := 1 to n do
  	begin
    	readln(fi,cuv);
      l := length(cuv);
      for car := 'a' to 'z' do
      	f[car] := 0;     { frecventele literelor din cuvantul curent }
      for j := 1 to l do
      	inc(f[cuv[j]]);    { Stabilim frecventele literelor din cuvant. }
      fillchar(c[i],16,#96);
      k := 16;
      for car := 'z' downto 'a' do  { Ordonam literele in cuvant. }
      	for j := 1 to f[car] do
        	begin
        		c[i][k] := car; dec(k);
          end
    end;
  for l := 16 downto 1 do { Grupam dupa locul l. }
  	begin
    	for car := #96 to 'z' do
      	nc[car] := 0; { numarul de cuvinte corespunzatoare fiecarui caracter }
    	for i := 1 to n do
      	begin
      		inc(nc[c[i][l]]);{Creste numarul de cuvinte corespunzator literei l. }
          mc[c[i][l],nc[c[i][l]]] := c[i];
        end;
      i := 0;
      for car := #96 to 'z' do { Culegem cuvintele in vectorul c. }
      	for j := 1 to nc[car] do
        	begin
          	inc(i); c[i] := mc[car,j]
          end;
  	end;
  c[0] := ' '; c[n+1] := ' '; { diferite de celelalte }
  for i := 1 to n do
  	if (c[i-1] <> c[i]) and (c[i] <> c[i+1]) then
    	inc(originale);
  writeln(fo,originale);
  close(fi); close(fo);
end.