字典树
关键在于怎样找出两个单词拼成的单词,可以用strncpy函数
字典树标记了单词的结尾
View Code
1 /* 2 字典树 3 */ 4 #include<stdio.h> 5 #include<stdlib.h> 6 #include<string.h> 7 #include<iostream> 8 #include<algorithm> 9 #include<queue> 10 #include<map> 11 #include<math.h> 12 using namespace std; 13 const int maxn = 55005; 14 const int inf = 0x7fffffff; 15 struct tree{ 16 int lev; 17 tree *next[ 26 ]; 18 }; 19 tree root; 20 void init(){ 21 for( int i=0;i<26;i++ ) 22 root.next[ i ]=NULL; 23 } 24 25 void creat_tree( char s[] ){ 26 int len=strlen( s ); 27 tree *p=&root,*tmp; 28 29 for( int i=0;i<len;i++ ){ 30 int id=s[ i ]-'a'; 31 if( p->next[ id ]==NULL ){ 32 tmp=( tree *)malloc(sizeof(root)); 33 /* 34 if( i!=len-1 ) 35 tmp->lev=-1; 36 else 37 tmp->lev=1; 38 */ 39 tmp->lev=-1; 40 for( int j=0;j<26;j++ ) 41 tmp->next[ j ]=NULL; 42 p->next[ id ]=tmp; 43 p=p->next[ id ]; 44 } 45 else{ 46 /* 47 if( i!=len-1 ) 48 p->next[id]->lev=-1; 49 else 50 p->next[id]->lev=1; 51 */ 52 //(p->next[id])->lev=-1; 53 p=p->next[id]; 54 } 55 } 56 p->lev=1; 57 return ; 58 } 59 60 int find( char s[] ){ 61 int len=strlen( s ); 62 tree *p=&root; 63 for( int i=0;i<len;i++ ){ 64 int id=s[i]-'a'; 65 if( p->next[id]==NULL ) return -1; 66 p=p->next[ id ]; 67 } 68 if( p->lev==1 ) return 1; 69 else return -1; 70 } 71 72 char s[ maxn ][ 105 ]; 73 int main(){ 74 int cnt=0; 75 init(); 76 //int n; 77 while( scanf("%s",s[ cnt ])!=EOF ){ 78 creat_tree( s[ cnt ] ); 79 cnt++; 80 } 81 char a[ 105 ],b[ 105 ]; 82 for( int i=0;i<cnt;i++ ){ 83 //printf("i:%d \n",i); 84 int len=strlen( s[i] ); 85 for( int j=0;j<len;j++ ){ 86 memset( a,'\0',sizeof(a) ); 87 memset( b,'\0',sizeof(b) ); 88 strncpy( a,s[i],j ); 89 strncpy( b,s[i]+j,len-j ); 90 //printf("a:%s@b:%s\n",a,b); 91 if( find( a )==1 && find( b )==1 ){ 92 printf("%s\n",s[i]); 93 break; 94 } 95 } 96 } 97 return 0; 98 }