Следующее слово (3 уровень) |
Условие :Задаётся некоторое слово, длина которого не превышает 80 символов, например GOTO. Из всех его букв составляются все возможные другие слова, может быть бессмысленные, например, GOOT, GOTO, GTOO, ..., TOOG. Каждая буква входит в образованное слово ровно столько же раз, сколько раз она встречается в исходном слове. Требуется написать программу, которая по заданному слову строит непосредственно следующее за ним по алфавиту слово в соответствии с описанным правилом. Технические требования: Входной файл: INPUT.TXT. Выходной файл: OUTPUT.TXT. Ограничение по времени: 5 секунд на один тест. Входной файл INPUT.TXT содержит одно слово, состоящее не более чем из 80 заглавных английских букв. Выходной файл OUTPUT.TXТ содержит одно слово, непосредственно следующее в алфавитном порядке за заданным, или фразу "no words", написанную малыми английскими буквами, если нужного слова найти не удаётся. Пример файлов входных и выходных данных: Input.txt Output.txt APAQ APQA Z no words
Решение: by Aleksey Shamis [sapisoft@yandex.ru]: Конечно, не стоит искать все варианты перестановок заданного слова, а потом искать среди них нужный. Вместо этого предлагаю следующий алгоритм. Просматривая заданное слово с конца, ищем первую пару символов, стоящую не в порядке убявания. Затем сортируем полученный ряд символов (от найденной пары до конца слова) по возростанию, и, поставив на первое место символ, идущий следующим по порядку за тем что был в отрезке первым, получаем слово которое было необходимо найти. Выше изложенные мысли реализованы в программе: const input='input.txt'; output='output.txt'; var i,j:integer; f:text; s,t,p,q:string; begin assign(f,input); reset(f); read(f,s); close(f); i:=length(s); while (s[i]<=s[i-1]) and (i<>1) do i:=i-1; t:=copy(s,i-1,length(s)-i+2);delete(s,i-1,length(s)-i+2); q:=copy(t,1,1);if i=1 then q:='no words'; for i:=1 to length(t)-1 do begin for j:=1 to length(t)-1 do begin if t[j]>t[j+1] then begin p:=copy(t,j,1); delete(t,j,1); insert(p,t,j+1); end; end; end; s:=s+t[pos(q,t)+1];delete(t,pos(q,t)+1,1);s:=s+t; if q='no words' then s:=q; assign(f,output); rewrite(f); write(f,s); close(f); end. |