#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
template < class S, class T> inline S chmin( S & a, T b) {
if ( a> b) {
a= b;
}
return a;
}
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
int dist( int a, int b) {
return abs ( a/ 6 - b/ 6 ) + abs ( a% 6 - b% 6 ) ;
}
int dp[ 26 ] [ 26 ] ;
int nx[ 26 ] [ 26 ] ;
class Solution{
public :
int minimumDistance( string word) {
int i, k;
int N = word.size ( ) ;
int c;
int res = 1073709056 ;
for ( i= ( 0 ) ; i< ( 26 ) ; i++ ) {
int j;
for ( j= ( 0 ) ; j< ( 26 ) ; j++ ) {
dp[ i] [ j] = 0 ;
}
}
for ( k= ( 0 ) ; k< ( N) ; k++ ) {
c = word[ k] - 'A' ;
for ( i= ( 0 ) ; i< ( 26 ) ; i++ ) {
int j;
for ( j= ( 0 ) ; j< ( 26 ) ; j++ ) {
nx[ i] [ j] = 1073709056 ;
}
}
for ( i= ( 0 ) ; i< ( 26 ) ; i++ ) {
int j;
for ( j= ( 0 ) ; j< ( 26 ) ; j++ ) {
chmin( nx[ i] [ c] , dp[ i] [ j] + dist( j,c) ) ;
chmin( nx[ c] [ j] , dp[ i] [ j] + dist( i,c) ) ;
}
}
for ( i= ( 0 ) ; i< ( 26 ) ; i++ ) {
int j;
for ( j= ( 0 ) ; j< ( 26 ) ; j++ ) {
dp[ i] [ j] = nx[ i] [ j] ;
}
}
}
for ( i= ( 0 ) ; i< ( 26 ) ; i++ ) {
int j;
for ( j= ( 0 ) ; j< ( 26 ) ; j++ ) {
chmin( res, dp[ i] [ j] ) ;
}
}
return res;
}
}
;
// cLay varsion 20200119-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int dist(int a, int b){
// return abs(a/6 - b/6) + abs(a%6 - b%6);
// }
//
// int dp[26][26], nx[26][26];
//
// class Solution {
// public:
// int minimumDistance(string word) {
// int N = word.size(), c;
// int res = int_inf;
// rep(i,26) rep(j,26) dp[i][j] = 0;
//
// rep(k,N){
// c = word[k] - 'A';
// rep(i,26) rep(j,26) nx[i][j] = int_inf;
// rep(i,26) rep(j,26){
// nx[i][c] <?= dp[i][j] + dist(j,c);
// nx[c][j] <?= dp[i][j] + dist(i,c);
// }
// rep(i,26) rep(j,26) dp[i][j] = nx[i][j];
// }
//
// rep(i,26) rep(j,26) res <?= dp[i][j];
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBTIGNobWluKFMgJmEsIFQgYil7CiAgaWYoYT5iKXsKICAgIGE9YjsKICB9CiAgcmV0dXJuIGE7Cn0KI2RlZmluZSBtYWluIGR1bW15X21haW4KaW50IG1haW4oKXsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgppbnQgZGlzdChpbnQgYSwgaW50IGIpewogIHJldHVybiBhYnMoYS82IC0gYi82KSArIGFicyhhJTYgLSBiJTYpOwp9CmludCBkcFsyNl1bMjZdOwppbnQgbnhbMjZdWzI2XTsKY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIGludCBtaW5pbXVtRGlzdGFuY2Uoc3RyaW5nIHdvcmQpewogICAgaW50IGksIGs7CiAgICBpbnQgTiA9IHdvcmQuc2l6ZSgpOwogICAgaW50IGM7CiAgICBpbnQgcmVzID0gMTA3MzcwOTA1NjsKICAgIGZvcihpPSgwKTtpPCgyNik7aSsrKXsKICAgICAgaW50IGo7CiAgICAgIGZvcihqPSgwKTtqPCgyNik7aisrKXsKICAgICAgICBkcFtpXVtqXSA9IDA7CiAgICAgIH0KICAgIH0KICAgIGZvcihrPSgwKTtrPChOKTtrKyspewogICAgICBjID0gd29yZFtrXSAtICdBJzsKICAgICAgZm9yKGk9KDApO2k8KDI2KTtpKyspewogICAgICAgIGludCBqOwogICAgICAgIGZvcihqPSgwKTtqPCgyNik7aisrKXsKICAgICAgICAgIG54W2ldW2pdID0gMTA3MzcwOTA1NjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yKGk9KDApO2k8KDI2KTtpKyspewogICAgICAgIGludCBqOwogICAgICAgIGZvcihqPSgwKTtqPCgyNik7aisrKXsKICAgICAgICAgIGNobWluKG54W2ldW2NdLCBkcFtpXVtqXSArIGRpc3QoaixjKSk7CiAgICAgICAgICBjaG1pbihueFtjXVtqXSwgZHBbaV1bal0gKyBkaXN0KGksYykpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IoaT0oMCk7aTwoMjYpO2krKyl7CiAgICAgICAgaW50IGo7CiAgICAgICAgZm9yKGo9KDApO2o8KDI2KTtqKyspewogICAgICAgICAgZHBbaV1bal0gPSBueFtpXVtqXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvcihpPSgwKTtpPCgyNik7aSsrKXsKICAgICAgaW50IGo7CiAgICAgIGZvcihqPSgwKTtqPCgyNik7aisrKXsKICAgICAgICBjaG1pbihyZXMsIGRwW2ldW2pdKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlczsKICB9Cn0KOwovLyBjTGF5IHZhcnNpb24gMjAyMDAxMTktMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBpbnQgZGlzdChpbnQgYSwgaW50IGIpewovLyAgIHJldHVybiBhYnMoYS82IC0gYi82KSArIGFicyhhJTYgLSBiJTYpOwovLyB9Ci8vIAovLyBpbnQgZHBbMjZdWzI2XSwgbnhbMjZdWzI2XTsKLy8gCi8vIGNsYXNzIFNvbHV0aW9uIHsKLy8gcHVibGljOgovLyAgIGludCBtaW5pbXVtRGlzdGFuY2Uoc3RyaW5nIHdvcmQpIHsKLy8gICAgIGludCBOID0gd29yZC5zaXplKCksIGM7Ci8vICAgICBpbnQgcmVzID0gaW50X2luZjsKLy8gICAgIHJlcChpLDI2KSByZXAoaiwyNikgZHBbaV1bal0gPSAwOwovLyAKLy8gICAgIHJlcChrLE4pewovLyAgICAgICBjID0gd29yZFtrXSAtICdBJzsKLy8gICAgICAgcmVwKGksMjYpIHJlcChqLDI2KSBueFtpXVtqXSA9IGludF9pbmY7Ci8vICAgICAgIHJlcChpLDI2KSByZXAoaiwyNil7Ci8vICAgICAgICAgbnhbaV1bY10gPD89IGRwW2ldW2pdICsgZGlzdChqLGMpOwovLyAgICAgICAgIG54W2NdW2pdIDw/PSBkcFtpXVtqXSArIGRpc3QoaSxjKTsKLy8gICAgICAgfQovLyAgICAgICByZXAoaSwyNikgcmVwKGosMjYpIGRwW2ldW2pdID0gbnhbaV1bal07Ci8vICAgICB9Ci8vIAovLyAgICAgcmVwKGksMjYpIHJlcChqLDI2KSByZXMgPD89IGRwW2ldW2pdOwovLyAgICAgcmV0dXJuIHJlczsKLy8gICB9Ci8vIH07Cg==