50142. Word Merge Sort, Again
難度:3/51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int k;
char file_names[20][20];
char out_name[40];
FILE* f_in[20];
FILE* f_out;
int using_cnt;
int using[20];
char list[20][3];
int read_chars(int idx){
int rtv = fscanf(f_in[idx], "%c%c%c", &list[idx][0], &list[idx][1], &list[idx][2]);
return rtv;
}
void write_chars(FILE* f_out, int idx){
fprintf(f_out, "%c%c%c", list[idx][0], list[idx][1], list[idx][2]);
}
// void print_chars(int idx){
// printf("%c%c%c", list[idx][0], list[idx][1], list[idx][2]);
// }
int hash(int a){
return (list[a][0] - 'a') * (26 * 26) +
(list[a][1] - 'a') * (26) +
(list[a][2] - 'a');
}
void solve(){
while(using_cnt > 0){
int min_idx = -1, min_val = INT_MAX;
for(int i = 0; i < k; i++){
if(using[i] == 0) continue;
int h = hash(i);
if(h < min_val) min_idx = i, min_val = h;
}
if(min_idx == -1) break;
write_chars(f_out, min_idx);
int rtv = read_chars(min_idx);
if(rtv == EOF) using[min_idx] = 0, using_cnt--;
}
}
int main(){
scanf("%d", &k);
for(int i = 0; i < k; i++) scanf("%s", file_names[i]);
scanf("%s", out_name);
for(int i = 0; i < k; i++) f_in[i] = fopen(file_names[i], "r"), using[i] = 1;
f_out = fopen(out_name, "w");
using_cnt = k;
for(int i = 0; i < k; i++){
int rtv = read_chars(i);
if(rtv == EOF) using[i] = 0, using_cnt--;
}
solve();
for(int i = 0; i < k; i++) fclose(f_in[i]);
fclose(f_out);
}