HDU1247

字典树

关键在于怎样找出两个单词拼成的单词,可以用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 }

 

你可能感兴趣的:(HDU)