// Выводит символы и пары символов, входящие в строку
// К вопросу otvet.mail.ru/question/182440175
// Copyleft Alexey Kuzminov 2015
program question182440175;
type
SymbolList = String; // Перечень символов, поддерживает размер (Length) и оператор []
// добавляет символ в список, возвращая признак того, он что уже был
function AddSymbol(var list: SymbolList; c: Char): Boolean;
var
p: Integer;
begin
p := Pos(c, list);
AddSymbol := p > 0;
if not AddSymbol then list := list + c;
// если AddSymbol = True, то можно передвинуть list[pos] к началу на символ,
// чтобы в следующий раз он быстрее нашелся
end;
// Обрабатывает строку символов.
// Выводит:
// - перечень символов, в нее входящих
// - перечень пар, которые в неё входят
procedure Process(const s: String);
var
symbols: SymbolList; // перечень символов строки
pair: array[char] of SymbolList; // массив пар символов (ab = pair[a] contains b)
var
i: Integer;
c: Char;
first: Boolean;
begin
// инициализация списка пустотой
symbols := '';
for c := Low(pair) to High(pair) do
pair[c] := '';
WriteLn('{', s, '}');
// случай пустой строки рассмотрим отдельно
if Length(s) = 0 then begin
WriteLn(' no chars');
Exit;
end;
// первый символ добавим вручную
AddSymbol(symbols, s[1]);
// начнем итерацию со второго символа
for i := 2 to Length(s) do begin
AddSymbol(symbols, s[i]);
first := not AddSymbol(pair[s[i-1]], s[i]);
// можно анализировать признак того, что пара s[i-1]s[i] ещё не была в строке
end;
// вывод символов строки
Write(' [');
for i := 1 to Length(symbols)-1 do
Write('''', symbols[i], ''', ');
WriteLn('''', symbols[Length(symbols)], ''']');
// вывод пар символов
Write(' [');
first := True;
for c := Low(pair) to High(pair) do if Length(pair) > 0 then
for i := 1 to Length(pair[c]) do begin
// перед первой парой символов не выводим ', '
if not first then Write(', ') else first := False;
Write('''', c, pair[c][i], '''');
end;
WriteLn(']');
end;
begin
Process('');
Process('a');
Process('aaaa');
Process('ababa');
Process('abbbaaababaa');
Process('abbbaaababaca');
end.
Ly8g0JLRi9Cy0L7QtNC40YIg0YHQuNC80LLQvtC70Ysg0Lgg0L/QsNGA0Ysg0YHQuNC80LLQvtC70L7Qsiwg0LLRhdC+0LTRj9GJ0LjQtSDQsiDRgdGC0YDQvtC60YMKLy8g0Jog0LLQvtC/0YDQvtGB0YMgb3R2ZXQubWFpbC5ydS9xdWVzdGlvbi8xODI0NDAxNzUKLy8gQ29weWxlZnQgQWxleGV5IEt1em1pbm92IDIwMTUKcHJvZ3JhbSBxdWVzdGlvbjE4MjQ0MDE3NTsKCnR5cGUKICBTeW1ib2xMaXN0ID0gU3RyaW5nOyAvLyDQn9C10YDQtdGH0LXQvdGMINGB0LjQvNCy0L7Qu9C+0LIsINC/0L7QtNC00LXRgNC20LjQstCw0LXRgiDRgNCw0LfQvNC10YAgKExlbmd0aCkg0Lgg0L7Qv9C10YDQsNGC0L7RgCBbXQoKLy8g0LTQvtCx0LDQstC70Y/QtdGCINGB0LjQvNCy0L7QuyDQsiDRgdC/0LjRgdC+0LosINCy0L7Qt9Cy0YDQsNGJ0LDRjyDQv9GA0LjQt9C90LDQuiDRgtC+0LPQviwg0L7QvSDRh9GC0L4g0YPQttC1INCx0YvQuwpmdW5jdGlvbiBBZGRTeW1ib2wodmFyIGxpc3Q6IFN5bWJvbExpc3Q7IGM6IENoYXIpOiBCb29sZWFuOwp2YXIKICBwOiBJbnRlZ2VyOwpiZWdpbgogIHAgOj0gUG9zKGMsIGxpc3QpOwogIEFkZFN5bWJvbCA6PSBwID4gMDsKICBpZiBub3QgQWRkU3ltYm9sIHRoZW4gbGlzdCA6PSBsaXN0ICsgYzsKICAvLyDQtdGB0LvQuCBBZGRTeW1ib2wgPSBUcnVlLCDRgtC+INC80L7QttC90L4g0L/QtdGA0LXQtNCy0LjQvdGD0YLRjCBsaXN0W3Bvc10g0Log0L3QsNGH0LDQu9GDINC90LAg0YHQuNC80LLQvtC7LAogIC8vINGH0YLQvtCx0Ysg0LIg0YHQu9C10LTRg9GO0YnQuNC5INGA0LDQtyDQvtC9INCx0YvRgdGC0YDQtdC1INC90LDRiNC10LvRgdGPCmVuZDsKCi8vINCe0LHRgNCw0LHQsNGC0YvQstCw0LXRgiDRgdGC0YDQvtC60YMg0YHQuNC80LLQvtC70L7Qsi4KLy8g0JLRi9Cy0L7QtNC40YI6Ci8vIC0g0L/QtdGA0LXRh9C10L3RjCDRgdC40LzQstC+0LvQvtCyLCDQsiDQvdC10LUg0LLRhdC+0LTRj9GJ0LjRhQovLyAtINC/0LXRgNC10YfQtdC90Ywg0L/QsNGALCDQutC+0YLQvtGA0YvQtSDQsiDQvdC10ZEg0LLRhdC+0LTRj9GCCnByb2NlZHVyZSBQcm9jZXNzKGNvbnN0IHM6IFN0cmluZyk7CnZhcgogIHN5bWJvbHM6IFN5bWJvbExpc3Q7IC8vINC/0LXRgNC10YfQtdC90Ywg0YHQuNC80LLQvtC70L7QsiDRgdGC0YDQvtC60LgKICBwYWlyOiBhcnJheVtjaGFyXSBvZiBTeW1ib2xMaXN0OyAvLyDQvNCw0YHRgdC40LIg0L/QsNGAINGB0LjQvNCy0L7Qu9C+0LIgKGFiID0gcGFpclthXSBjb250YWlucyBiKQp2YXIKICBpOiBJbnRlZ2VyOwogIGM6IENoYXI7CiAgZmlyc3Q6IEJvb2xlYW47CmJlZ2luCiAgLy8g0LjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0YHQv9C40YHQutCwINC/0YPRgdGC0L7RgtC+0LkKICBzeW1ib2xzIDo9ICcnOyAKICBmb3IgYyA6PSBMb3cocGFpcikgdG8gSGlnaChwYWlyKSBkbwogICAgcGFpcltjXSA6PSAnJzsKCiAgV3JpdGVMbigneycsIHMsICd9Jyk7CiAKICAvLyDRgdC70YPRh9Cw0Lkg0L/Rg9GB0YLQvtC5INGB0YLRgNC+0LrQuCDRgNCw0YHRgdC80L7RgtGA0LjQvCDQvtGC0LTQtdC70YzQvdC+CiAgaWYgTGVuZ3RoKHMpID0gMCB0aGVuIGJlZ2luCiAgICBXcml0ZUxuKCcgICBubyBjaGFycycpOwogICAgRXhpdDsKICBlbmQ7CiAgCiAgLy8g0L/QtdGA0LLRi9C5INGB0LjQvNCy0L7QuyDQtNC+0LHQsNCy0LjQvCDQstGA0YPRh9C90YPRjgogIEFkZFN5bWJvbChzeW1ib2xzLCBzWzFdKTsKICAvLyDQvdCw0YfQvdC10Lwg0LjRgtC10YDQsNGG0LjRjiDRgdC+INCy0YLQvtGA0L7Qs9C+INGB0LjQvNCy0L7Qu9CwCiAgZm9yIGkgOj0gMiB0byBMZW5ndGgocykgZG8gYmVnaW4KICAgIEFkZFN5bWJvbChzeW1ib2xzLCBzW2ldKTsKICAgIGZpcnN0IDo9IG5vdCBBZGRTeW1ib2wocGFpcltzW2ktMV1dLCBzW2ldKTsKICAgIC8vINC80L7QttC90L4g0LDQvdCw0LvQuNC30LjRgNC+0LLQsNGC0Ywg0L/RgNC40LfQvdCw0Log0YLQvtCz0L4sINGH0YLQviDQv9Cw0YDQsCBzW2ktMV1zW2ldINC10YnRkSDQvdC1INCx0YvQu9CwINCyINGB0YLRgNC+0LrQtQogIGVuZDsKICAKICAvLyDQstGL0LLQvtC0INGB0LjQvNCy0L7Qu9C+0LIg0YHRgtGA0L7QutC4CiAgV3JpdGUoJyAgIFsnKTsKICBmb3IgaSA6PSAxIHRvIExlbmd0aChzeW1ib2xzKS0xIGRvCiAgICBXcml0ZSgnJycnLCBzeW1ib2xzW2ldLCAnJycsICcpOwogIFdyaXRlTG4oJycnJywgc3ltYm9sc1tMZW5ndGgoc3ltYm9scyldLCAnJyddJyk7CgogIC8vINCy0YvQstC+0LQg0L/QsNGAINGB0LjQvNCy0L7Qu9C+0LIKICBXcml0ZSgnICAgWycpOwogIGZpcnN0IDo9IFRydWU7CiAgZm9yIGMgOj0gTG93KHBhaXIpIHRvIEhpZ2gocGFpcikgZG8gaWYgTGVuZ3RoKHBhaXIpID4gMCB0aGVuIAogICAgZm9yIGkgOj0gMSB0byBMZW5ndGgocGFpcltjXSkgZG8gYmVnaW4KICAgICAgLy8g0L/QtdGA0LXQtCDQv9C10YDQstC+0Lkg0L/QsNGA0L7QuSDRgdC40LzQstC+0LvQvtCyINC90LUg0LLRi9Cy0L7QtNC40LwgJywgJwogICAgICBpZiBub3QgZmlyc3QgdGhlbiBXcml0ZSgnLCAnKSBlbHNlIGZpcnN0IDo9IEZhbHNlOwogICAgICBXcml0ZSgnJycnLCBjLCBwYWlyW2NdW2ldLCAnJycnKTsKICAJZW5kOwogIFdyaXRlTG4oJ10nKTsKZW5kOyAgCiAgCmJlZ2luCiAgUHJvY2VzcygnJyk7CiAgUHJvY2VzcygnYScpOwogIFByb2Nlc3MoJ2FhYWEnKTsKICBQcm9jZXNzKCdhYmFiYScpOwogIFByb2Nlc3MoJ2FiYmJhYWFiYWJhYScpOwogIFByb2Nlc3MoJ2FiYmJhYWFiYWJhY2EnKTsKZW5kLg==
{}
no chars
{a}
['a']
[]
{aaaa}
['a']
['aa']
{ababa}
['a', 'b']
['ab', 'ba']
{abbbaaababaa}
['a', 'b']
['ab', 'aa', 'bb', 'ba']
{abbbaaababaca}
['a', 'b', 'c']
['ab', 'aa', 'ac', 'bb', 'ba', 'ca']