/*
* 解题思路:
* 又是一道坑人陷阱题 ! 数组要开大才能过、要不然一直报RE错,因为存在重复字符串会超过5000
* 用了两种方法写、不知道为什么第一种是错的、一直过不了OJ,第二种可以过AC!
*/
下面是AC代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define A 1000010 #define B 220 char ss[ A ][ B ]; int cmp_string( const void*_a , const void *_b ) { char *a = ( char * )_a; char *b = ( char * )_b; return strcmp( a,b ); } int main( ) { int p,q,flag; int i; char c; p = q = 0; memset(ss,‘\0‘,sizeof( ss ) ); while( ( c=getchar( ) ) != EOF ) { if( c >=‘A‘ && c <=‘Z‘ ) c = c-‘A‘+‘a‘; if( c >=‘a‘ && c <= ‘z‘ ) ss[ p ][ q++ ] = c ; else { ss[ p++ ][ q ] = ‘\0‘; q = 0; } } qsort( ss , p , sizeof( ss[ 0 ] ) , cmp_string ); for( i=0;i<p;i++ ) if( strcmp( ss[ i ] ,ss[ i+1 ] ) && ss[ i ][ 0 ] !=‘\0‘ ) printf("%s\n",ss[ i ] ); return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> #define A 1100000 #define B 220 char ss[ A ][ B ]; int cmp_string( const void*_a , const void *_b ) { char *a = ( char * )_a; char *b = ( char * )_b; return strcmp( a,b ); } int main( ) { int p,q,flag; int i; char c; p =0; c = ‘0‘; while( c != EOF ) { q = flag = 0; memset( ss[ p ] ,‘\0‘,sizeof( ss[ p ] ) ); while( ( c = getchar( ) ) != ‘\n‘ && c!=‘ ‘ && c!=EOF ) { if( c >=‘A‘ && c <=‘Z‘ ) c = c-‘A‘+‘a‘; if( c >=‘a‘ && c <= ‘z‘ ) ss[ p ][ q++ ] = c ; flag = 1; } if( flag ) p++; } qsort( ss , p , sizeof( ss[ 0 ] ) , cmp_string ); for( i=0;i<p;i++ ) if( strcmp( ss[ i ] ,ss[ i+1 ] ) ) puts( ss[ i ] ); return 0; }