Олимпиадная задача школьного этапа Всероссийской олимпиады школьников по информатике 2015-2016 учебный год.
Условие задачи взято на сайте http://contest.ncstu.ru/
Ох уж эти ученые...
Имя входного файла
input.txt
Имя выходного файла
output.txt
Максимальное время работы на одном тесте
2 секунды
Ограничение по памяти
64 МБ
"...Британские ученые выяснили, что чаще всего взламывают пароли, содержащие группы одинаковых подряд идущих символов, пробелы и звездочки, и гораздо реже пароли, содержащие многоточия..."
Услышав эту новость, Вася крепко задумался: почти все его пароли попадают в группу риска!!! Для того чтобы исправить ситуацию, он решил конвертировать все свои пароли по следующему правилу: от группы одинаковых символов оставить один, два и более пробелов заменить на знак подчёркивания, а две и более звездочки на многоточие. Напишите программу, которая будет быстро и правильно производить конвертацию пароля.
Формат входных данных:
Задан пароль непустая строка длиной до 100 000 символов, которая может состоять из строчных букв латинского алфавита, пробелов и символов '*'.
Формат выходных данных:
Выведите пароль, полученный после конвертации.
Пример
input.txt
output.txt
abcd
abcd
aaabbc**
abc...
Описание алгоритма:
Читаем посимвольно до конца файла.
Идём по массиву. Если текущий символ не равен следующему то:
если символ повторялся и является буквой, то выводим этот символ
если символ повторялся и является * то выводим . . .
если символ повторялся и является пробелом, то выводим _
если символ не повторялся, то выводим его
переходим к следующему символу
сбрасываем переменную повторов
если текущий символ равен следующему, то наращиваем переменную повторов
повторяем до конца массива символов.
program scientist;
var
i,n,schet:integer;
akk:char;
a:array[1..100001] of char;
begin
assign(input,'input.txt');
assign(output,'output.txt');
r
·eset(input);
rewrite(output);
while not eof(input) do begin
inc(i);
read(input,a[i]);
inc(n);
end;
//for i:=1 to n do
//write(a[i]);
akk:=a[1];
schet:=1;
for i:=2 to n+1 do begin
if ord(akk)<>ord(a[i]) then begin
if (schet>=2) and (akk in ['a'..'z']) then
write(output,akk);
if (schet>=2) and (akk='*') then
write(output,'...');
if (schet>=2) and (akk=' ') then
write(output,'_');
if schet=1 then
write(output,akk);
akk:=a[i];
schet:=0;
end;
if ord(akk)=ord(a[i]) then
inc(schet);
end;
close(input);
close(output);
end.