POJ 3959 - Alignment of Code
http://poj.org/problem?id=3959
概要
各行に1つ以上の空白によって区切られた単語のリストが与えられるので、\(i\) 番目の単語の開始位置が揃うように空白を調節したものを出力する。
制約
- 各行に単語は1つ以上存在する
- 単語は1文字から80文字
- 各行は180文字以下
- 全体で1000行以下
解法
やるだけ。
poj/3959.cc1 #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 }