만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

디자인 공개 올림피아드

시간 제한1초메모리 제한1024 MB

요약
길이가 주어진 n개의 문자열을 사전순으로 엄격히 증가하게 만들 때 필요한 최소 알파벳 개수를 구합니다.
난이도

보통10점 중 7점

유형
이분 탐색, 그리디, 스택, 문자열
정답자
아직 제출이 없습니다

문제

프로그래밍 대회를 준비하는 사람 중 상당수는 예전에 참가자였습니다. 이전 참가자는 대회의 세부 사항을 잘 알고 있어서 문제 설명을 쓰고 채점 시스템을 운영하는 등 많은 일을 맡을 수 있습니다. 그렇다면 디자이너가 대회를 준비하면 어떻게 될까요?

가상의 세계에서 Open Olympiad in Design이 열립니다. 문제는 nn개이며, 문제마다 담당 문제 설명 디자이너가 한 명씩 있습니다. 문제 이름을 담당하는 디자이너가 한 명, 글꼴 디자이너가 한 명 있습니다. 문제 설명 디자이너는 이미 작업을 마쳤고, 문제 이름을 위해 고정된 공간을 남겨 두었습니다. ii번 문제의 이름은 정확히 lil_i글자여야 합니다.

문제 이름은 유니코드 문자로 이루어져야 하고, 서로 달라야 하며, 사전순으로 정렬되어야 합니다. 글꼴 디자이너는 모든 조건을 만족하면서 사용하는 서로 다른 글자의 수가 가능한 한 적도록 이름을 골라 달라고 요청했습니다. 문제의 순서는 바꿀 수 없습니다.

주어진 길이의 단어 nn개를 서로 다르고 사전순으로 정렬되게 만드는 데 필요한 서로 다른 글자의 최소 개수를 구하세요.

입력

첫째 줄에 문제의 개수 nn (1≤n≤100 0001 \leq n \leq 100\,000)이 주어집니다.

둘째 줄에는 문제 이름의 길이 l1,l2,…,lnl_1, l_2, \ldots, l_n (1≤li≤1091 \leq l_i \leq 10^9)이 공백으로 구분되어 주어집니다.

출력

글꼴 디자이너가 칠해야 하는 서로 다른 글자의 최소 개수를 한 줄에 출력합니다.

참고

문자열 x1x2…xax_1 x_2 \ldots x_a가 문자열 y1y2…yby_1 y_2 \ldots y_b보다 사전순으로 작다는 것은, 두 문자열이 처음 다른 위치 ii에서 xi<yix_i < y_i이거나, 첫 번째 문자열이 두 번째 문자열의 진접두사인 경우를 뜻합니다. 서로 다른 단어들의 나열은 각 단어가 다음 단어보다 작을 때 정렬되어 있다고 합니다.

예제2

  1. 예제 1

    입력
    5
    2 2 2 2 2
    
    예상 출력
    3
    
  2. 예제 2

    입력
    4
    3 1 2 2
    
    예상 출력
    2