6
6
/* By: mihykim <[email protected] > +#+ +:+ +#+ */
7
7
/* +#+#+#+#+#+ +#+ */
8
8
/* Created: 2020/04/25 15:47:45 by mihykim #+# #+# */
9
- /* Updated: 2020/04/25 19:26:15 by mihykim ### ########.fr */
9
+ /* Updated: 2020/05/15 17:00:01 by mihykim ### ########.fr */
10
10
/* */
11
11
/* ************************************************************************** */
12
12
27
27
#include <stdlib.h>
28
28
#include <math.h>
29
29
30
+ # define ALPHABET 52
31
+ # define NONE -1
32
+
33
+ typedef struct s_node
34
+ {
35
+ struct s_node * next [ALPHABET ];
36
+ int index ;
37
+ } t_node ;
38
+
39
+ t_node * root [ALPHABET ];
30
40
char name [200001 ][21 ];
31
41
int parent [200000 ];
32
42
int size [200000 ];
33
43
int n ;
34
44
35
- int name_to_idx ( char input [] )
45
+ t_node * activate_node ( void )
36
46
{
47
+ t_node * node ;
37
48
int i = 0 ;
38
49
39
- while (i < n )
50
+ node = malloc (sizeof (t_node ));
51
+ while (i < ALPHABET )
52
+ node -> next [i ++ ] = NULL ;
53
+ node -> index = NONE ;
54
+ return (node );
55
+ }
56
+
57
+ int ft_atoi (char c )
58
+ {
59
+ if (c >= 'a' && c <= 'z' )
60
+ return (c - 'a' );
61
+ return (c - 'A' );
62
+ }
63
+
64
+ int ft_trie (char * name )
65
+ {
66
+ int i , j ;
67
+ t_node * curr ;
68
+
69
+ j = ft_atoi (name [0 ]);
70
+ if (root [j ] == NULL )
71
+ root [j ] = activate_node ();
72
+ curr = root [j ];
73
+ for (i = 1 ; name [i ]; i ++ )
74
+ {
75
+ j = ft_atoi (name [i ]);
76
+ if (curr -> next [j ] == NULL )
77
+ curr -> next [j ] = activate_node ();
78
+ curr = curr -> next [j ];
79
+ }
80
+ if (curr -> index == NONE )
40
81
{
41
- if (strcmp (input , name [i ]) == 0 )
42
- return (i );
43
- i ++ ;
82
+ curr -> index = n ;
83
+ parent [n ] = n ;
84
+ size [n ] = 1 ;
85
+ n ++ ;
44
86
}
45
- strcpy (name [n ], input );
46
- parent [n ] = n ;
47
- size [n ] = 1 ;
48
- return (n ++ );
87
+ return (curr -> index );
49
88
}
50
89
51
- int find (int i )
90
+ int ft_find (int i )
52
91
{
53
92
if (i == parent [i ])
54
93
return (i );
55
- return (parent [i ] = find (parent [i ]));
94
+ return (parent [i ] = ft_find (parent [i ]));
56
95
}
57
96
58
- int union_by_size (int a , int b )
97
+ int ft_union (int a , int b )
59
98
{
60
99
int tmp ;
61
100
@@ -81,14 +120,16 @@ int main(void)
81
120
scanf ("%d" , & t );
82
121
while (t -- )
83
122
{
123
+ for (int i = 0 ; i < ALPHABET ; i ++ )
124
+ root [i ] = activate_node ();
84
125
scanf ("%d" , & f );
85
126
n = 0 ;
86
127
while (f -- )
87
128
{
88
129
scanf ("%s %s" , name1 , name2 );
89
- a = name_to_idx (name1 );
90
- b = name_to_idx (name2 );
91
- printf ("%d\n" , union_by_size ( find (a ), find (b )));
130
+ a = ft_trie (name1 );
131
+ b = ft_trie (name2 );
132
+ printf ("%d\n" , ft_union ( ft_find (a ), ft_find (b )));
92
133
}
93
134
}
94
135
return (0 );
0 commit comments