POJ 3959 - Alignment of Code

http://poj.org/problem?id=3959

概要

各行に1つ以上の空白によって区切られた単語のリストが与えられるので、\(i\) 番目の単語の開始位置が揃うように空白を調節したものを出力する。

制約

解法

やるだけ。

 1 #include <cstdio>
 2 #include <string>
 3 #include <vector>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9   vector<vector<string> > lines;
10   size_t max_words = 0;
11   for (char buf[200]; fgets(buf, sizeof buf, stdin) != NULL;) {
12     vector<string> words;
13     char word[100];
14     char *p = buf;
15     int n;
16     while (sscanf(p, "%s%n", word, &n) != EOF) {
17       words.push_back(word);
18       p += n;
19     }
20     lines.push_back(words);
21     max_words = max(max_words, words.size());
22   }
23   const int N = lines.size();
24 
25   vector<int> lens;
26   for (size_t j = 0; j < max_words; j++) {
27     size_t len = 0;
28     for (int i = 0; i < N; i++) {
29       if (j < lines[i].size()) {
30         len = max(len, lines[i][j].size());
31       }
32     }
33     lens.push_back(len);
34   }
35 
36   for (int i = 0; i < N; i++) {
37     const int M = lines[i].size();
38     for (int j = 0; j < M; j++) {
39       if (j != 0) {
40         putchar(' ');
41       }
42       fputs(lines[i][j].c_str(), stdout);
43       if (j != M-1) {
44         for (int k = lines[i][j].size(); k < lens[j]; k++) {
45           putchar(' ');
46         }
47       }
48     }
49     putchar('\n');
50   }
51   return 0;
52 }
poj/3959.cc