POJ 3550 - AT-sequence
http://poj.org/problem?id=3550
概要
AT-sequence とは、"AT" というプレフィックスの後にいくつかの command が続くような文字列である。 AT-sequence には空白は含まれていない。
command は header と任意の value (非負の4桁以下の数値) からなる。 value が存在するときは、header と value は "=" によって区切られる。
header は2つの部分からなる。 1つ目の部分は必須であり、
- 1つまたは2つの大文字のアルファベット
- "&", "#", "@" のうちのいずれかの記号1つと、1つの大文字のアルファベット
のどちらかである。 2つ目の部分は任意であり、20桁以下の非負の整数である。
正しい形式の AT-sequence が与えられるので、それに含まれている各 command を順に改行で区切って出力する。
制約
- AT-sequence は500文字以下
解法
やるだけ。
poj/3550.cc1 #include <iostream> 2 #include <algorithm> 3 #include <cctype> 4 using namespace std; 5 6 typedef string::const_iterator Iterator; 7 8 void digits(Iterator& it, const Iterator& last, int limit) 9 { 10 for (int i = 0; i < limit && isdigit(*it) && it != last; ++i, ++it); 11 } 12 13 void header(Iterator& it, const Iterator& last) 14 { 15 if (isupper(*it) || *it == '&' || *it == '#' || *it == '@') { 16 ++it; 17 if (isupper(*it)) { 18 ++it; 19 } 20 digits(it, last, 20); 21 } else { 22 throw __LINE__; 23 } 24 } 25 26 void command(Iterator& it, const Iterator& last) 27 { 28 const Iterator save = it; 29 header(it, last); 30 if (*it == '=') { 31 ++it; 32 digits(it, last, 4); 33 } 34 cout << string(save, it) << endl; 35 } 36 37 int main() 38 { 39 string s; 40 getline(cin, s); 41 Iterator it = s.begin()+2, last = s.end(); 42 while (it != last) { 43 command(it, last); 44 } 45 return 0; 46 }