SRM302 div2 medium
mapを使うと効率がよい。
あとは、placeboardを変形してそのままreturnにしたいので、あまり関係のない処理はしたくない。例えば、John-PBとかになったときに、-をどうして処理するかとか。
>||-||<をたとえば、空白に置き換えるとスムーズにできそうではあるが、その後に戻さなければならず、結構めんどくさい。
そこで部分文字列を使ってみた。
class XBallGame { public: vectornewStatistics(vector placeboard) { int sz = placeboard.size(); map > table; vector > board(sz); for(int i = 0; i < sz; i++) { int pos = placeboard[i].find('-'); string name = placeboard[i].substr(0, pos); string position = placeboard[i].substr(pos+1); table[name].insert(position); board[i].first = name; board[i].second = position; } for(int i = 0; i < sz; i++) { set pos = table[board[i].first]; set ::iterator it; for(it = pos.begin(); it != pos.end(); it++) { if(*it != board[i].second) { placeboard[i] += ',' + (*it); } } } return placeboard; }
出力系のぶぶんはgetlineを使っても割と簡単にかける。
string tmp[2]; int j = 0; string str; istringstream iss(placeboard[i]); while( getline(iss, str, '-') ) { tmp[j] = str; j++; }
//こうしてもうまくいかない. for(int i = 0; i < sz; i++) { char name[22], position[3]; sscanf(placeboard[i].c_str(), "%s-%s", name, position); //sscabf(placeboard[i].c_str(), "%s-%s", &name, &position); もだめ。 board[i].first = string(name); board[i].second = string(position); table[string(name)].insert(string(position)); cout << name <<"::"<< position << endl; }
//こうすればうまく取り込めるが、nameが何文字が分からないので、使えない.
for(int i = 0; i < sz; i++) {
char name[22], position[3];
sscanf(placeboard[i].c_str(), "%4s-%4s", name, position);
}
//どうしてもsscanfを使いたいのであれば、%[A-Z]という風にするとよい。 ただし、範囲文字列指定"-"はANSI Cの標準ではない。反転^は標準みたい. http://d.hatena.ne.jp/kenta11626918/20110412/1302619244 char name[22], position[3]; sscanf(placeboard[i].c_str(), "%[A-za-z]-%[A-Z]", name, position); //ただ、こうかく人はほとんどいないだろうね。