http://acm.pku.edu.cn/JudgeOnline/problem?id=1035

   Пример решения на Pascal:

Код:
program PKU1035;
const maxn = 10000;

type integer = longint;
     Tstring = string[15];

var a: array[1..maxn] of Tstring;
    n: integer;

var st: Tstring;

procedure prepare;
begin
  n := 0; readln(st);
  repeat
    n := n + 1;
    a[n] := st;
    readln(st);
  until st = '#';
end;

function appear(var st: Tstring): boolean;
var i: integer;
begin
  appear := true;
  for i := 1 to n do if a[i] = st then exit;
  appear := false;
end;

function replace(l: integer; var s, t: Tstring): boolean;
var i, sum: integer;
begin
  sum := 0;
  for i := 1 to l do if s[i] <> t[i] then sum := sum + 1;
  replace := (sum = 1);
end;

function more(l: integer; var s, t: Tstring): boolean;
var i: integer;
begin
  i := 0;
  while (i < l) and (s[1 + i] = t[1 + i]) do i := i + 1;
  while (i < l) and (s[1 + i] = t[2 + i]) do i := i + 1;
  more := i = l;
end;

procedure find(var st: Tstring);
var len, i, l: integer;
begin
  len := length(st);
  for i := 1 to n do begin
    l := length(a[i]);
    if (len = l) and replace(l, st, a[i]) then write(' ', a[i]) else
    if (len = l - 1) and more(len, st, a[i]) then write(' ', a[i]) else
    if (len = l + 1) and more(l, a[i], st) then write(' ', a[i]);
  end;
end;

procedure main;
begin
  readln(st);
  repeat
    if appear(st) then writeln(st, ' is correct')
    else begin
      write(st, ':');
      find(st); writeln;
    end;
    readln(st);
  until st = '#';
end;

begin
  prepare;
  main;
end.

Пример решения на С++:

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define N 10010
char   dict[N][20];
int    result[N];
int    len;

int  check( char a[20], char b[20] )
{
    int l1= strlen(a), l2= strlen(b);
    int num= 0;
    
    if( l1== l2 )
    {
        for( int i= 0; i< l1; ++i )
        if( a[i]!= b[i] && ++num>= 2 ) return -1;
        
        if( num== 0 )  return 2;
    }
    else if( l1< l2 )
    {
        for( int i= 0, j= 0; i< l1 && j< l2; ++i, ++j )
        if( a[i]!= b[j] )
        {
            if( ++num>= 2 ) return -1;
            i--;
        }
    }
    else
    {
        for( int i= 0, j= 0; i< l1 && j< l2; ++i, ++j )
            if( a[i]!= b[j] )
            {
                if( ++num>= 2 ) return -1;
                j--;
            }
    }

    return 1;
}

int main()
{
    char  str[20];
    
    while( scanf("%s", str), strcmp( str, "#" )!= 0 )  strcpy( dict[len++], str );
    while( scanf("%s", str), strcmp( str, "#" )!= 0 )
    {
        int size= strlen( str );
        int tt= 0;
        bool equal= false;
        
        for( int i= 0; i< len; ++i )
        {
            int ll= strlen( dict[i] );
            
            if( abs( ll- size )< 2  )  
            {
                int  value= check( dict[i], str );
                
                if( value== 1 )   result[tt++]= i;
                else if( value== 2 )
                {
                    printf("%s is correct\n", str);
                    equal= true;
                    
                    break;
                }
            }
        }
        
        if( !equal )
        {
            printf("%s:", str );
            for( int i= 0; i< tt; ++i )
            printf(" %s", dict[ result[i] ]);
            
            printf("\n");
        }    
    }
    
    return 0;
}