- accumulate()で文字結合
- map
は使わない - 文字をint型に代入する
まず、1.番目。vectorで与えられた入力をconcatenate して新しい文字列を作成せよ。よくありますね。これをどう書くか。
vector<string> x;
void init() {
x.push_back("acchan");
x.push_back("yuko");
x.push_back("yukirin");
x.push_back("mayuyu");
}
int main() {
init();
string y = "";
REP(i, x.size())
y += x[i];
cout << y << endl;
return 0;
}
でもいいけど、accumulate()を使うとちょっとだけかっこよく書けます。accumulate()はdefaultでは演算子+を用いる。stringに対する+は文字の結合なのでそのまま使えます。
int main() {
init();
string y = accumulate(ALL(x), string());
cout << y << endl;
return 0;
}
次に、2.番目。文字の出現回数を数えています。char -> intへの写像なので、mapを使うのが自然に見えます。
int main() {
string x = "riverponiiteerutoshushuheavyrotationeverydaykachusha";
map<char, int> cnt;
REP(i, x.size())
cnt[x[i]]++;
}
でも、charなんて高々[0, 256)までなので、配列に入れるのもありです。C++の配列はランダムアクセスなので、こっちの方が計算量は安いです。[0, 256)と書きましたが、ASCIIコード表を見ると、実際に使われるコードは[0, 128)で十分のようです。AKBのメンバーの名前を覚える暇があったら、ASCIIコードを覚えましょう。(→自分)
int main() {
string x = "riverponiiteerutoshushuheavyrotationeverydaykachusha";
int cnt[128];
memset(cnt, 0, sizeof(cnt));
REP(i, x.size())
cnt[x[i]]++;
}
最後に、3.番目。これは、文字をインクリメントして走査したい場合です。それぞれの数字がdigit中に何回出てくるかを標準出力に表示します。
int main() {
string digit = "1234254723075027659279743057423953";
for (char i = '0'; i <= '9'; i++)
cout << count(ALL(digit), i) << endl;
}
とか、
int main() {
string digit = "1234254723075027659279743057423953";
REP(i, 10)
cout << count(ALL(digit), i+'0') << endl;
}
とかやっていましたが、以下のようにできますね。プロコン界伝統の悪しきマクロで書いてますが、iはintで持っています。charではなく、intで持っていた方が何かと便利です。
int main() {
string digit = "1234254723075027659279743057423953";
FOR (i, '0', '9'+1)
cout << count(ALL(digit), i) << endl;
}
0 件のコメント:
コメントを投稿