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つ目の部分は必須であり、

のどちらかである。 2つ目の部分は任意であり、20桁以下の非負の整数である。

正しい形式の AT-sequence が与えられるので、それに含まれている各 command を順に改行で区切って出力する。

制約

解法

やるだけ。

 1 #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 }
poj/3550.cc