program main
   
  implicit none
  integer :: n, i, j
  integer, allocatable :: s(:)
  character(10), allocatable :: names(:)
  
  read(*,*) n
  allocate( names(n) )
  do i = 1, n
    read(*,*) names(i)
  end do

  call quicksort1( names, 1, n ) 

  j = 0 
  do i = 1, n
    if( names(i) /= names(i+1) ) then
      j = j + 1
    end if 
  end do

  print*,j

end program main
recursive subroutine quicksort1( namec, first, last )

  implicit none
  character(10), intent(inout) :: namec(*)
  integer,intent(in)::first,last
  !
  ! Original
  ! https://gist.github.com/t-nissie/479f0f16966925fa29ea
  !
  character(100)::x,t
  integer::i,j

  x = namec((first+last)/2)
  i = first
  j = last
  do
     do while ( LGT( x, namec(i) ) )
        i=i+1
     end do
     do while ( LGT( namec(j), x ) )
        j=j-1
     end do
     if (i >= j) exit
     t = namec(i)
     namec(i) = namec(j)
     namec(j) = t
     i=i+1
     j=j-1
  end do
  if (first < i-1) call quicksort1( namec, first, i-1  )
  if (j+1 < last)  call quicksort1( namec, j+1  , last )

  return

end subroutine quicksort1
