#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef double lf; typedef long double Lf; typedef pair pii; typedef pair pll; #define TRACE(x) cerr << #x << " " << x << endl #define FOR(i, a, b) for (int i = (a); i < int(b); i++) #define REP(i, n) FOR(i, 0, n) #define all(x) (x).begin(), (x).end() #define _ << " " << #define fi first #define sec second #define mp make_pair const int MAXN = 110; const int tip1[] = {'Q','W','E','R','T','Y','U','I','O','P'}; const int tip2[] = {'A','S','D','F','G','H','J','K','L'}; const int tip3[] = {'Z','X','C','V','B','N','M'}; pii get(int t) { REP(i, 10) if (tip1[i] == t) return mp(0, i); REP(i, 9) if (tip2[i] == t) return mp(1, i); REP(i, 7) if (tip3[i] == t) return mp(2, i); } int n, dp[MAXN][3][11][3][11]; char s[MAXN]; int rek(int cvor, int a1, int b1, int a2, int b2) { if (cvor == n) return 0; if (dp[cvor][a1][b1][a2][b2] != -1) return dp[cvor][a1][b1][a2][b2]; int ret = (1 << 30); pii t = get(s[cvor]); ret = min(ret, rek(cvor + 1, a1, b1, t.fi, t.sec) + max(a2-t.fi,t.fi-a2) + max(b2-t.sec,t.sec-b2)); ret = min(ret, rek(cvor + 1, t.fi, t.sec, a2, b2) + max(a1-t.fi,t.fi-a1) + max(b1-t.sec,t.sec-b1)); return dp[cvor][a1][b1][a2][b2] = ret; } int main() { scanf("%s",s); n = strlen(s); memset(dp, -1, sizeof dp); pii t1 = get('F'); pii t2 = get('J'); printf("%d\n",rek(0,t1.fi,t1.sec,t2.fi,t2.sec)); return 0; }