#include using namespace std; #define INF 1000000000 #define MAXL 105 #define MAXN 3 #define MAXM 11 char S[MAXN][MAXM] = { "QWERTYUIOP", "ASDFGHJKL", "ZXCVBNM" }; map > pos; int dp[MAXL][MAXN][MAXM][MAXN][MAXM]; void update(int &a, int b) { a = min(a, b); } int calcDist(int a, int b, int c, int d) { return abs(a - c) + abs(b - d); } int main() { // assert(freopen("keyboard.in", "r", stdin)); // assert(freopen("keyboard.out", "w", stdout)); cin.sync_with_stdio(false); for (int i = 0; i < 3; i++) { for (int j = 0; j < 10; j++) { pos[ S[i][j] ] = { i, j }; } } string str; cin >> str; int N = str.size(); // init for (int p = 0; p <= N; p++) { for (int a = 0; a < MAXN; a++) { for (int b = 0; b < MAXM; b++) { for (int c = 0; c < MAXN; c++) { for (int d = 0; d < MAXM; d++) { dp[p][a][b][c][d] = INF; } } } } } dp[0][1][3][1][6] = 0; for (int i = 0; i < N; i++) { for (int a = 0; a < MAXN; a++) { for (int b = 0; b < MAXM; b++) { for (int c = 0; c < MAXN; c++) { for (int d = 0; d < MAXM; d++) { auto p = pos[ str[i] ]; // type with left int cost = calcDist(a, b, p.first, p.second); update(dp[i + 1][p.first][p.second][c][d], dp[i][a][b][c][d] + cost); // type with right cost = calcDist(c, d, p.first, p.second); update(dp[i + 1][a][b][p.first][p.second], dp[i][a][b][c][d] + cost); } } } } } int ans = INF; for (int a = 0; a < MAXN; a++) { for (int b = 0; b < MAXM; b++) { for (int c = 0; c < MAXN; c++) { for (int d = 0; d < MAXM; d++) { ans = min(ans, dp[N][a][b][c][d]); } } } } cout << ans << endl; return 0; }