문자열 시퀀스 분석

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

문제

암호 분석에서는 어떤 언어에서 개별 글자와 글자 시퀀스가 얼마나 자주 나타나는지가 매우 중요한 단서가 된다. 예를 들어 영어 문장에서는 E, L, N, R, S, T가 가장 자주 쓰이는 글자들이며, 자주 나타나는 두 글자·세 글자 조합 등을 알면 암호문에 대해 훨씬 많은 것을 알아낼 수 있다.

텍스트 한 덩어리를 읽어 글자 시퀀스 빈도를 분석하는 프로그램을 작성하라. 길이가 1부터 5까지인 각 시퀀스 길이에 대해, 빈도가 높은 상위 다섯 개에 해당하는 시퀀스들을 보고한다. 즉 가장 자주 나타나는 한 글자들, 두 글자 조합들, …, 다섯 글자 조합들까지 각각 상위 다섯 개의 빈도를 보고한다.

알파벳 문자가 연속으로 이어진 구간만 고려하며, 대소문자는 구분하지 않는다(aA는 같은 글자로 취급). 길이가 $L$인 시퀀스란 이러한 알파벳 구간 하나 안에 완전히 포함되는, 연속된 $L$개의 글자를 말한다. 시퀀스는 알파벳이 아닌 문자를 가로질러 이어지지 않는다.

입력

입력은 임의 길이의 텍스트 한 덩어리이며, 여러 줄에 걸쳐 있을 수 있다. 파일 끝까지 모두 읽는다. 텍스트에는 글자·숫자·문장 부호·공백이 섞여 있을 수 있다.

출력

길이 1부터 5까지 각 시퀀스 길이마다 한 구획씩 출력한다. 각 구획은 다음 머리글 줄로 시작한다.

Analysis for Letter Sequences of Length L

그다음 줄에는 머리글과 같은 길이의 대시(-)를 41개 출력한다. 이어서 해당 길이에 대해 빈도를 내림차순으로, 서로 다른 상위 다섯 개 빈도까지만 출력한다. 각 빈도마다 다음과 같이 출력한다.

Frequency = F, Sequence(s) = (S1,S2,...)

여기서 S1, S2, …는 정확히 $F$번 나타나는 모든 시퀀스이며, 대문자로 쓰고 공백 없이 쉼표로 구분하며 사전순으로 나열한다. 어떤 길이의 서로 다른 빈도가 다섯 개보다 적으면 존재하는 만큼만 출력한다(하나도 없을 수 있다). 서로 다른 길이 구획 사이는 빈 줄 하나로 구분한다.