#include <iostream>
#include <vector>
#include <string>
#include <cstdint>
#include <map>
#include <limits>
#include <algorithm>
typedef std::vector<std::int64_t> DType;
typedef std::tuple < DType, std::int64_t,std::int64_t> VType;
typedef std::vector<VType> SType;
typedef std::map<DType, std::int64_t> MType;
DType MakeVector(const std::string& S) {
DType D;
for (auto& o : S) {
if (o != '_') {
char S[]{ o,'\0' };
D.push_back(std::atoi(S));
}
else {
D.push_back(-1);
}
}
return D;
}
std::int64_t CountNext(const DType& D, std::size_t P) {
std::int64_t C = 0;
for (std::size_t i = 0; i < D.size(); i++) {
if (D[(P + i) % D.size()] == -1) {
C++;
}
else {
break;
}
}
return C;
}
std::int64_t Solvar(DType D) {
SType S;
MType M;
VType V;
std::int64_t C;
std::int64_t Sc;
std::int64_t Min = std::numeric_limits<std::int64_t>::max();
S.push_back({ D,0,0 });
while (S.size() != 0) {
std::tie(D, Sc, C) = S.back();
S.pop_back();
if (Min <= Sc+CountNext(D,Sc%D.size())) continue;
if (C == 2)continue;
/**/
if (S.size() > D.size()/2+1) {
std::int64_t T = M[D];
if (T == 0) {
M[D] = Sc;
}
else {
if (T!=0&&T+1 <= Sc) continue;
M[D] = Sc;
}
}
/**/
if(C<2)S.push_back({ D,Sc,C+1 });
if (C == 0) {
std::int64_t T = D[Sc%D.size()];
if (T == -1) {
Sc++;
}
else {
D[Sc%D.size()] = -1;
Sc += T;
}
if (std::find_if_not(D.begin(), D.end(), [](auto& o) {return o == -1; }) == D.end()) {
if (Min > Sc) {
Min = Sc;
M[D] = Sc;
}
}
else {
S.push_back({ D,Sc + CountNext(D,Sc%D.size()),0 });
}
}
else {
Sc++;
S.push_back({ D,Sc+ CountNext(D,Sc%D.size()),0 });
}
}
return Min;
}
std::int64_t MakeHoge(const std::string& S) {
DType D = MakeVector(S);
return Solvar(D);
}
bool Show(const std::string& S, std::int64_t N) {
std::cout << N << ':' << S << std::endl;
return true;
}
int main() {
std::string S;
std::int64_t V = 0;
S = "12_3";
V=MakeHoge(S);
Show(S, V);
S = "313__";
V=MakeHoge(S);
Show(S, V);
S = "4_35_1264_23_434";
V=MakeHoge(S);
Show(S, V);
S = "123456789123456789";
V=MakeHoge(S);
Show(S, V);
S = "88967472612377988186";
V=MakeHoge(S);
Show(S, V);
S = "19898693316679441672";
V=MakeHoge(S);
Show(S, V);
S = "93769682716711132249893";
V=MakeHoge(S);
Show(S, V);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGxpbWl0cz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OmludDY0X3Q+IERUeXBlOwp0eXBlZGVmIHN0ZDo6dHVwbGUgPCBEVHlwZSwgc3RkOjppbnQ2NF90LHN0ZDo6aW50NjRfdD4gVlR5cGU7CnR5cGVkZWYgc3RkOjp2ZWN0b3I8VlR5cGU+IFNUeXBlOwp0eXBlZGVmIHN0ZDo6bWFwPERUeXBlLCBzdGQ6OmludDY0X3Q+IE1UeXBlOwoKRFR5cGUgTWFrZVZlY3Rvcihjb25zdCBzdGQ6OnN0cmluZyYgUykgewoJRFR5cGUgRDsKCWZvciAoYXV0byYgbyA6IFMpIHsKCQlpZiAobyAhPSAnXycpIHsKCQkJY2hhciBTW117IG8sJ1wwJyB9OwoJCQlELnB1c2hfYmFjayhzdGQ6OmF0b2koUykpOwoJCX0KCQllbHNlIHsKCQkJRC5wdXNoX2JhY2soLTEpOwoJCX0KCX0KCglyZXR1cm4gRDsKfQoKc3RkOjppbnQ2NF90IENvdW50TmV4dChjb25zdCBEVHlwZSYgRCwgc3RkOjpzaXplX3QgUCkgewoJc3RkOjppbnQ2NF90IEMgPSAwOwoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IEQuc2l6ZSgpOyBpKyspIHsKCQlpZiAoRFsoUCArIGkpICUgRC5zaXplKCldID09IC0xKSB7CgkJCUMrKzsKCQl9CgkJZWxzZSB7CgkJCWJyZWFrOwoJCX0KCX0KCXJldHVybiBDOwp9CgpzdGQ6OmludDY0X3QgU29sdmFyKERUeXBlIEQpIHsKCVNUeXBlIFM7CglNVHlwZSBNOwoJVlR5cGUgVjsKCXN0ZDo6aW50NjRfdCBDOwoJc3RkOjppbnQ2NF90IFNjOwoJc3RkOjppbnQ2NF90IE1pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjppbnQ2NF90Pjo6bWF4KCk7CglTLnB1c2hfYmFjayh7IEQsMCwwIH0pOwoJd2hpbGUgKFMuc2l6ZSgpICE9IDApIHsKCQlzdGQ6OnRpZShELCBTYywgQykgPSBTLmJhY2soKTsKCQlTLnBvcF9iYWNrKCk7CgkJaWYgKE1pbiA8PSBTYytDb3VudE5leHQoRCxTYyVELnNpemUoKSkpIGNvbnRpbnVlOwoJCWlmIChDID09IDIpY29udGludWU7Ci8qKi8KCQlpZiAoUy5zaXplKCkgPiBELnNpemUoKS8yKzEpIHsKCQkJc3RkOjppbnQ2NF90IFQgPSBNW0RdOwoJCQlpZiAoVCA9PSAwKSB7CgkJCQlNW0RdID0gU2M7CgkJCX0KCQkJZWxzZSB7CgkJCQlpZiAoVCE9MCYmVCsxIDw9IFNjKSBjb250aW51ZTsKCQkJCU1bRF0gPSBTYzsKCQkJfQoJCX0KLyoqLwoJCWlmKEM8MilTLnB1c2hfYmFjayh7IEQsU2MsQysxIH0pOwoJCWlmIChDID09IDApIHsKCQkJc3RkOjppbnQ2NF90IFQgPSBEW1NjJUQuc2l6ZSgpXTsKCQkJaWYgKFQgPT0gLTEpIHsKCQkJCVNjKys7CgkJCX0KCQkJZWxzZSB7CgkJCQlEW1NjJUQuc2l6ZSgpXSA9IC0xOwoJCQkJU2MgKz0gVDsKCQkJfQoJCQlpZiAoc3RkOjpmaW5kX2lmX25vdChELmJlZ2luKCksIEQuZW5kKCksIFtdKGF1dG8mIG8pIHtyZXR1cm4gbyA9PSAtMTsgfSkgPT0gRC5lbmQoKSkgewoJCQkJaWYgKE1pbiA+IFNjKSB7CgkJCQkJTWluID0gU2M7CgkJCQkJTVtEXSA9IFNjOwoJCQkJfQoJCQl9CgkJCWVsc2UgewoJCQkJUy5wdXNoX2JhY2soeyBELFNjICsgQ291bnROZXh0KEQsU2MlRC5zaXplKCkpLDAgfSk7CgkJCX0KCQl9CgkJZWxzZSB7CgkJCVNjKys7CgkJCVMucHVzaF9iYWNrKHsgRCxTYysgQ291bnROZXh0KEQsU2MlRC5zaXplKCkpLDAgfSk7CgkJfQoKCX0KCglyZXR1cm4gTWluOwp9CnN0ZDo6aW50NjRfdCBNYWtlSG9nZShjb25zdCBzdGQ6OnN0cmluZyYgUykgewoJRFR5cGUgRCA9IE1ha2VWZWN0b3IoUyk7CgoJcmV0dXJuIFNvbHZhcihEKTsKfQpib29sIFNob3coY29uc3Qgc3RkOjpzdHJpbmcmIFMsIHN0ZDo6aW50NjRfdCBOKSB7CglzdGQ6OmNvdXQgPDwgTiA8PCAnOicgPDwgUyA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gdHJ1ZTsKfQoKaW50IG1haW4oKSB7CglzdGQ6OnN0cmluZyBTOwoJc3RkOjppbnQ2NF90IFYgPSAwOwoKCVMgPSAiMTJfMyI7CglWPU1ha2VIb2dlKFMpOwoJU2hvdyhTLCBWKTsKCglTID0gIjMxM19fIjsKCVY9TWFrZUhvZ2UoUyk7CglTaG93KFMsIFYpOwoJUyA9ICI0XzM1XzEyNjRfMjNfNDM0IjsKCVY9TWFrZUhvZ2UoUyk7CglTaG93KFMsIFYpOwkKCVMgPSAiMTIzNDU2Nzg5MTIzNDU2Nzg5IjsKCVY9TWFrZUhvZ2UoUyk7CglTaG93KFMsIFYpOwoJUyA9ICI4ODk2NzQ3MjYxMjM3Nzk4ODE4NiI7CglWPU1ha2VIb2dlKFMpOwoJU2hvdyhTLCBWKTsKCVMgPSAiMTk4OTg2OTMzMTY2Nzk0NDE2NzIiOwoJVj1NYWtlSG9nZShTKTsKCVNob3coUywgVik7CglTID0gIjkzNzY5NjgyNzE2NzExMTMyMjQ5ODkzIjsKCVY9TWFrZUhvZ2UoUyk7CglTaG93KFMsIFYpOwoJcmV0dXJuIDA7Cn0=