超级水题,不说了。。。 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX = 200; typedef struct _Node { char original[10]; char actual[10]; }Node; Node data[MAX]; void setactual( Node & left ) { char mid; strcpy( left.actual , left.original ); int len = strlen( left.original ); for( int i = 0 ; i < len ; ++i ) { int min = i ; for( int j = i + 1 ; j < len ; ++j ) if( left.actual[j] < left.actual[min] ) min = j ; if( min != i ) { mid = left.actual[i]; left.actual[i] = left.actual[min]; left.actual[min] = mid; } } } bool cmp( const Node & left , const Node & right ) { int re = strcmp( left.actual , right.actual ); if( re != 0 ) return re < 0 ; return strcmp( left.original , right.original ) < 0; } int binarysearchlower( int left , int right , char * key ) { int middle; while( left <= right ) { middle = ( left + right )/2; if( strcmp( data[middle].actual , key ) < 0 ) left = middle + 1; else right = middle - 1; } if( strcmp( data[left].actual , key ) == 0 ) return left; else return -1; } int binarysearchupper( int left , int right , char * key ) { int middle; while( left <= right ) { middle = ( left + right )/2; if( strcmp( data[middle].actual , key ) <= 0 ) left = middle + 1; else right = middle - 1; } if( strcmp( data[right].actual , key ) == 0 ) return right; else return -1; } int main() { int n = 0 ; Node mid; while( scanf("%s",data[n].original ) ) { if( strcmp( data[n].original , "XXXXXX" ) == 0 ) break; setactual( data[n] ); ++n; } sort( &data[0] , &data[n] , cmp ); while( scanf("%s",mid.original ) ) { if( strcmp( mid.original , "XXXXXX" ) == 0 ) break; setactual( mid ); int left = binarysearchlower( 0 , n - 1 , mid.actual ); int right = binarysearchupper( 0 , n - 1 , mid.actual ); if( left == -1 ) printf("NOT A VALID WORD/n"); else { for( int i = left ; i <= right ; ++i ) printf("%s/n",data[i].original ); } printf("******/n"); } }