program FindLinks; {R-} uses strings; const n_max = 8915;{это максимальное количество слов в словаре} w_max = 16;{это максимальная длина слова} type p_str = ^str_char; str_char = string[w_max];{это для динамического строкового массива} TDynArr = array[1..1] of p_str; PDynArr = ^TDynArr; label 1, 2;{метки для проверок} var f: text;{файл со словарем и парами для поиска} t_wd2, t_wd3: str_char; n, i, j: word; p_arr: PDynArr;{динамический строковый массив} p_arr2, p_arr3: PDynArr;{динамический строковый массив} n_par: word;{количество обнаруженных в словаре дублетов} v_pair1, v_pair2: str_char;{считанная пара} p1: word; {функция проверки двух слов на дублет} function CheckDoubles(str_val1: str_char; str_val2: str_char):boolean; var n1, n2, k, i: word; begin CheckDoubles:= False; n1:= length(str_val1); n2:= length(str_val2); if n1 <> n2 then exit; k:= 0; for i:= 1 to n1 do if (str_val1[i] <> str_val2[i]) and (str_val1[i]<>'') and (str_val2[i]<>'') then k:= k + 1 ; if k = 1 then CheckDoubles:= True; end; begin assign(f, 'input.txt'); {сначала выясняем количество слов для получения динамического массива} reset(f); n:= 0; while not eof(f) do begin readln(f, t_wd2); if (n > n_max) or (length(t_wd2) = 0) then goto 1; n:= n + 1; end; 1: close(f); reset(f); {этот самый динамический строковый массив объявляем} GetMem(p_arr, n * SizeOf(p_str)); for i:= 1 to n do New(p_arr^[i]); {зачитываем слова в словарь} writeln('Производится считывание словаря...'); i:= 1; n:= 0; while not eof(f) do begin readln(f, t_wd2); if (n > n_max) or (length(t_wd2) = 0) then goto 2; n:= n + 1; p_arr^[n]^:= t_wd2; end; {формируем массивы для дублетов} 2: writeln('Найдено ', n, ' слов в словаре'); {GetMem(p_arr2, n * SizeOf(str_char)); GetMem(p_arr3, n * SizeOf(str_char)); writeln('Производится поиск дублетов в словаре...');} {ищем пары дублетов} {n_par:= 0 ; for i:= 1 to n do begin t_wd2:= p_arr^[i]; for j:= i + 1 to n do begin t_wd3:= p_arr^[j]; if CheckDoubles(t_wd2, t_wd3) = true then begin n_par:= n_par + 1; p_arr2^[n_par]:= t_wd2; p_arr3^[n_par]:= t_wd3; end; end; end; writeln('Обнаружено ', n_par, ' дублетов в словаре');} {идем до пустой строки в словаре} {while not (length(t_wd2) = 0) do readln(f, t_wd2); writeln('Производится обработка пар...'); while not eof(f) do begin readln(f, v_pair1); p1:= Pos(' ', v_pair1); if p1 > 0 then begin v_pair2:= v_pair1; v_pair1:= Copy(v_pair1, 1, p1 - 1); v_pair2:= Copy(v_pair2, p1 + 1, length(v_pair2) - p1); {writeln(v_pair1, '-', v_pair2);}{ end else writeln(v_pair1,' - пара не обнаружена'); end; close(f); {чистим собственно массив} {FreeMem(p_arr, n * SizeOf(str_char)); FreeMem(p_arr2, n * SizeOf(str_char)); FreeMem(p_arr3, n * SizeOf(str_char));} j:= 2; for i:= 1 to n do writeln (i, '-', p_arr^[i]^, '-', p_arr^[j]^); FreeMem(p_arr, n * SizeOf(p_str)); readln; end.