#include #include #include #include #include using namespace std; #define MAXN 110 #define MAXL 30 char a0[] = "QWERTYUIOP"; int L1 = sizeof(a0)-1; char a1[] = "ASDFGHJKL"; int L2 = sizeof(a1)-1; char a2[] = "ZXCVBNM"; int L3 = sizeof(a2)-1; int dst[MAXL][MAXL]; int cabs(int x) { return (x < 0) ? (-x) : x; } void precompute() { memset(dst, 0, sizeof(dst)); for (int i = 0; i < L1; ++i) for (int j = i + 1; j < L1; ++j) dst[a0[i] - 'A'][a0[j] - 'A'] = dst[a0[j] - 'A'][a0[i] - 'A'] = cabs(i - j); for (int i = 0; i < L2; ++i) for (int j = i + 1; j < L2; ++j) dst[a1[i] - 'A'][a1[j] - 'A'] = dst[a1[j] - 'A'][a1[i] - 'A'] = cabs(i - j); for (int i = 0; i < L3; ++i) for (int j = i + 1; j < L3; ++j) dst[a2[i] - 'A'][a2[j] - 'A'] = dst[a2[j] - 'A'][a2[i] - 'A'] = cabs(i - j); for (int i = 0; i < L1; ++i) for (int j = 0; j < L2; ++j) dst[a0[i] - 'A'][a1[j] - 'A'] = dst[a1[j] - 'A'][a0[i] - 'A'] = cabs(i - j) + 1; for (int i = 0; i < L2; ++i) for (int j = 0; j < L3; ++j) dst[a1[i] - 'A'][a2[j] - 'A'] = dst[a2[j] - 'A'][a1[i] - 'A'] = cabs(i - j) + 1; for (int i = 0; i < L1; ++i) for (int j = 0; j < L3; ++j) dst[a0[i] - 'A'][a2[j] - 'A'] = dst[a2[j] - 'A'][a0[i] - 'A'] = cabs(i - j) + 2; } int dp[MAXN][MAXL]; int solve(char *buf) { int L = strlen(buf); int A = L1 + L2 + L3; for (int a = 0; a < A; ++a) { int l1 = buf[0] - 'A'; int l2 = a; dp[0][l2] = min(dst['F' - 'A'][l1] + dst['J' - 'A'][l2], dst['F' - 'A'][l2] + dst['J' - 'A'][l1]); } for (int i = 1; i < L; ++i) for (int a = 0; a < A; ++a) { dp[i][a] = INT_MAX; for (int b = 0; b < A; ++b) { int l1 = buf[i] - 'A'; dp[i][a] = min(dp[i][a], dp[i - 1][b] + min(dst[b][l1] + dst[buf[i - 1] - 'A'][a], dst[b][a] + dst[buf[i - 1] - 'A'][l1])); } } int answer = INT_MAX; for (int i = 0; i < A; ++i) answer = min(answer, dp[L - 1][i]); return answer; } char buff[100]; int main() { precompute(); scanf("%s", buff); printf("%d\n", solve(buff)); return 0; }