순서가 정해진 쿠폰의 부분수열로 ZAG에서 시작하고 ZAG에서 끝나는 서로 다른 도시 열의 개수를 10^9+7로 나눈 나머지를 구한다.
보통7동적 계획법해시맵조합론아직 제출이 없습니다시간 제한5초메모리 제한512 MB미르코가 경품 행사에서 세계 일주 항공권을 받았다. 이 항공권은 n장의 탑승 쿠폰 f1,f2,…,fn으로 이루어져 있고, k번째 쿠폰으로는 출발 도시 ak에서 도착 도시 bk로 가는 직항 한 편을 탈 수 있다. 흔한 세계 일주 항공권과 달리, 한 쿠폰의 도착 도시가 다음 쿠폰의 출발 도시와 같을 필요는 없다. 미르코는 각 쿠폰을 최대 한 번만 쓸 수 있고, 아예 쓰지 않아도 된다. 다만 쿠폰은 원래 순서대로만 쓸 수 있다. 즉 i<j인 쿠폰 fi와 fj를 모두 쓴다면 fi를 fj보다 먼저 써야 한다.
여정은 여행에서 방문한 도시를 순서대로 나열한 수열이고, 같은 도시가 여러 번 나올 수도 있다. 여정의 첫 도시와 마지막 도시는 미르코가 사는 자그레브여야 하며, 여정에는 다른 도시가 적어도 하나 더 있어야 한다. 도시가 같은 순서로 나열되면 미르코가 서로 다른 쿠폰을 써서 날아갔더라도 같은 여정이다. 미르코가 이 항공권으로 만들 수 있는 서로 다른 여정의 수를 m이라고 하자. m을 109+7으로 나눈 나머지를 구하시오.
첫 줄에 탑승 쿠폰의 수를 나타내는 자연수 n (1≤n≤300000)이 주어진다.
이어지는 n개 줄 중 k번째 줄에는 k번째 쿠폰의 출발 도시 코드 ak와 도착 도시 코드 bk가 주어지고, 두 코드는 서로 다르다. 모든 도시 코드는 알파벳 대문자 정확히 세 개로 이루어진 문자열이다. 자그레브의 코드는 ZAG이다.
서로 다른 여정의 수를 109+7으로 나눈 나머지를 출력한다.
첫 번째 예제에서 가능한 여정은 ZAG-SPU-ZAG과 ZAG-SPU-ZAG-SPU-ZAG 두 가지다. 앞의 여정은 쿠폰 두 장을 고르는 서로 다른 방법 세 가지로 만들 수 있지만 한 번만 센다.