По сути, причина в том, что вам не хватает памяти. Когда вы делаете push_back
, вектор может перераспределяться, что потребует capacity + capacity * 2
(множитель может отличаться) количество места в непрерывном выделении. Если вы зарезервируете заранее, это решит эту проблему, но вам все равно потребуется n
смежных байта памяти.
Лучшее решение - просто прочитать строку и выполнить некоторое умножение, например:
size_t repeatedString( const std::string &s, size_t n ) {
size_t sz = s.size();
size_t cnt = 0;
for ( const char &c : s ) {
if ( c == 'a' ) {
++cnt;
}
}
size_t mult = n / sz;
cnt *= mult;
size_t rem = n % sz;
for ( size_t idx = 0; idx < rem; ++idx ) {
if ( s[idx] == 'a' ) {
++cnt;
}
}
return cnt;
}
Это позволяет избежать необходимости выделять дополнительные n
байтов, что сокращает объем памяти.