#pragma GCC optimize ("O3")
#pragma GCC target ("avx2")
#include <bits/stdc++.h>
using namespace std;
// update 17/06/28 経路情報
// update 17/07/08 気持ち(手抜き)高速化
// update 17/07/15 サンプル追加 バグ修正
struct chktime{ //時間測定
chrono::system_clock::time_point ctm;
chktime() { reset();}
void reset() { ctm=chrono::system_clock::now();}
uint64_t gtm(){
auto ptm = chrono::system_clock::now() - ctm;
return chrono::duration_cast<chrono::milliseconds>(ptm).count();
}
void disp(){ cout <<"time(ms)="<< gtm() <<"\n";}
};
int16_t dp[(1<<26) +16], bf[(1<<26) +16];
int dvn[1050];
int cal(const string& str, vector<int>& ans){
const int n = str.size();
for(int i=0;i<1048;i++) dvn[i] = i / n;
int si[30] ={};
for(int i=0; i<n; ++i){
si[i] = str[i] == '_' ? 0 : str[i] - '0';
}
memset(dp, 0x04, sizeof dp);// 0x0404 = 1028
memset(bf, -1, sizeof bf);
dp[0] = 0;
int gl=0;
for(int j=0; j<n; ++j) if(si[j] != 0) gl += 1<<j;
for(int i=0; i< gl; ++i){
for(int j=0; j<n; ++j)/* if(si[j] !=0 && !(i>>j &1))*/{//
int mi = i | 1 << j;
//int ptm = (dp[i] -j + n -1)/n; // n*ptm+j 食事開始可能時間
//assert((dp[i] -j + n -1) < 1040 );
int ptm = dvn[dp[i] -j + n -1]; //除算回避
int cmx = n*ptm + j + si[j];
if(dp[mi] > cmx){
dp[mi] = cmx; bf[mi] = j;
}
}
}
// 経路情報復元
for(int pf=gl; bf[pf] >= 0; pf -= 1<<bf[pf] ) ans.push_back(bf[pf]);
reverse(ans.begin(), ans.end());
return dp[gl];
}
void mpath(string str, const vector<int>& path){
cout <<" 順番(index) : ";
for(auto x: path) cout << x <<" ";
cout <<endl;
int cr=0, n=str.size();
printf("%9s : %8s %8s %8s %8s :: status obj(n=%d)\n",
"idx","wait","start","eating","end-time",n);
for( auto pt : path){
int ptm = ( cr -pt + n -1)/n;
int stt = n*ptm+pt; // = (cr/n + (cr%n > pt) ) *n + pt;
int skj = str[pt] - '0';
string dsp = str;
dsp[pt]='S'; dsp[(pt+skj)%n]='E';
printf ("%9d : %8d %8d %8d %8d",pt, stt-cr, stt, skj, stt+ skj);
printf (" :: %s\n", dsp.c_str());
cr = stt + skj; str[pt] = '_';
}
cout <<endl;
}
int main()
{
chktime tma;
string s;
while(cin >> s){
vector<int> jn;
tma.reset();
cout << s <<" ---> " <<cal(s, jn) <<endl;
tma.disp();
mpath(s, jn);
}
return 0;
}
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPMyIpCiNwcmFnbWEgR0NDIHRhcmdldCAoImF2eDIiKQogCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLy8gdXBkYXRlIDE3LzA2LzI4IOe1jOi3r+aDheWgsQovLyB1cGRhdGUgMTcvMDcvMDgg5rCX5oyB44GhKOaJi+aKnOOBjSnpq5jpgJ/ljJYKLy8gdXBkYXRlIDE3LzA3LzE1IOOCteODs+ODl+ODq+i/veWKoCAg44OQ44Kw5L+u5q2jCiAKc3RydWN0IGNoa3RpbWV7ICAvL+aZgumWk+a4rOWumgoJY2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgY3RtOwoJY2hrdGltZSgpIHsgcmVzZXQoKTt9Cgl2b2lkIHJlc2V0KCkgeyBjdG09Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpO30KCXVpbnQ2NF90IGd0bSgpewoJCWF1dG8gcHRtID0gY2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpIC0gY3RtOwoJCXJldHVybiBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjptaWxsaXNlY29uZHM+KHB0bSkuY291bnQoKTsKCX0KCXZvaWQgZGlzcCgpeyBjb3V0IDw8InRpbWUobXMpPSI8PCBndG0oKSA8PCJcbiI7fQp9OwogCmludDE2X3QgZHBbKDE8PDI2KSArMTZdLCBiZlsoMTw8MjYpICsxNl07CmludCBkdm5bMTA1MF07CiAKaW50IGNhbChjb25zdCBzdHJpbmcmIHN0ciwgdmVjdG9yPGludD4mIGFucyl7CiAKCWNvbnN0IGludCBuID0gc3RyLnNpemUoKTsKCWZvcihpbnQgaT0wO2k8MTA0ODtpKyspIGR2bltpXSA9IGkgLyBuOwoJaW50IHNpWzMwXSA9e307Cglmb3IoaW50IGk9MDsgaTxuOyArK2kpewoJCXNpW2ldID0gc3RyW2ldID09ICdfJyA/IDAgOiBzdHJbaV0gLSAnMCc7Cgl9CiAKCW1lbXNldChkcCwgMHgwNCwgc2l6ZW9mIGRwKTsvLyAweDA0MDQgPSAxMDI4CgltZW1zZXQoYmYsIC0xLCBzaXplb2YgYmYpOwogCglkcFswXSA9IDA7CglpbnQgZ2w9MDsKCWZvcihpbnQgaj0wOyBqPG47ICsraikgaWYoc2lbal0gIT0gMCkgZ2wgKz0gMTw8ajsKCWZvcihpbnQgaT0wOyBpPCBnbDsgKytpKXsKCQlmb3IoaW50IGo9MDsgajxuOyArK2opLyogaWYoc2lbal0gIT0wICYmICEoaT4+aiAmMSkpKi97Ly8KCQkJaW50IG1pID0gaSB8IDEgPDwgajsKCQkJLy9pbnQgcHRtID0gKGRwW2ldIC1qICsgbiAtMSkvbjsgLy8gbipwdG0raiAg6aOf5LqL6ZaL5aeL5Y+v6IO95pmC6ZaTCgkJCS8vYXNzZXJ0KChkcFtpXSAtaiArIG4gLTEpIDwgMTA0MCApOwoJCQlpbnQgcHRtID0gZHZuW2RwW2ldIC1qICsgbiAtMV07IC8v6Zmk566X5Zue6YG/CgkJCWludCBjbXggPSBuKnB0bSArIGogKyBzaVtqXTsKCQkJaWYoZHBbbWldID4gY214KXsKCQkJCWRwW21pXSA9IGNteDsgYmZbbWldID0gajsKCQkJfQoJCX0KCX0KCS8vIOe1jOi3r+aDheWgseW+qeWFgwoJZm9yKGludCBwZj1nbDsgYmZbcGZdID49IDA7IHBmIC09IDE8PGJmW3BmXSApIGFucy5wdXNoX2JhY2soYmZbcGZdKTsKCXJldmVyc2UoYW5zLmJlZ2luKCksIGFucy5lbmQoKSk7CglyZXR1cm4gZHBbZ2xdOwp9CiAKdm9pZCBtcGF0aChzdHJpbmcgc3RyLCBjb25zdCB2ZWN0b3I8aW50PiYgcGF0aCl7CiAKCWNvdXQgPDwiIOmghueVqihpbmRleCkgOiAiOwoJZm9yKGF1dG8geDogcGF0aCkgY291dCA8PCB4IDw8IiAiOwoJY291dCA8PGVuZGw7CglpbnQgY3I9MCwgbj1zdHIuc2l6ZSgpOwogCglwcmludGYoIiU5cyA6ICU4cyAlOHMgJThzICU4cyA6OiBzdGF0dXMgb2JqKG49JWQpXG4iLAoJCSJpZHgiLCJ3YWl0Iiwic3RhcnQiLCJlYXRpbmciLCJlbmQtdGltZSIsbik7Cglmb3IoIGF1dG8gcHQgOiBwYXRoKXsKCQlpbnQgcHRtID0gKCBjciAtcHQgKyBuIC0xKS9uOwoJCWludCBzdHQgPSBuKnB0bStwdDsgIC8vID0gKGNyL24gKyAoY3IlbiA+IHB0KSApICpuICsgcHQ7CiAKCQlpbnQgc2tqID0gc3RyW3B0XSAtICcwJzsKCQlzdHJpbmcgZHNwID0gc3RyOwoJCWRzcFtwdF09J1MnOyBkc3BbKHB0K3Nraiklbl09J0UnOwoJCXByaW50ZiAoIiU5ZCA6ICU4ZCAlOGQgJThkICU4ZCIscHQsIHN0dC1jciwgc3R0LCBza2osICBzdHQrIHNraik7CgkJcHJpbnRmICgiIDo6ICVzXG4iLCBkc3AuY19zdHIoKSk7CgkJY3IgPSAgc3R0ICsgc2tqOyBzdHJbcHRdID0gJ18nOwoJfQoJY291dCA8PGVuZGw7Cn0KIAppbnQgbWFpbigpCnsKIAoJY2hrdGltZSB0bWE7CglzdHJpbmcgczsKCXdoaWxlKGNpbiA+PiBzKXsKCQl2ZWN0b3I8aW50PiBqbjsKCQl0bWEucmVzZXQoKTsKCQljb3V0IDw8IHMgPDwiIC0tLT4gIiA8PGNhbChzLCBqbikgPDxlbmRsOwoJCXRtYS5kaXNwKCk7CgkJbXBhdGgocywgam4pOwoJfQogCglyZXR1cm4gMDsKfQ==
MTQ0MzIKODg3NjU0MzI5CjEyXzMKMzEzX18KNF8zNV8xMjY0XzIzXzQzNAoxMjM0NTY3ODkxMjM0NTY3ODkKODg5Njc0NzI2MTIzNzc5ODgxODYKMTk4OTg2OTMzMTY2Nzk0NDE2NzIKOTM3Njk2ODI3MTY3MTExMzIyNDk4OTMKOTM3Njk2ODI3MTY3MTExMzIyNDkxMjM0NQo=
14432
887654329
12_3
313__
4_35_1264_23_434
123456789123456789
88967472612377988186
19898693316679441672
93769682716711132249893
9376968271671113224912345