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; }