#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; #define sz size() #define pb push_back #define mp make_pair #define fi first #define se second #define all(c) (c).begin(), (c).end() #define rep(i,a,b) for(ll i=(a);i<(b);++i) #define per(i,a,b) for(ll i=b-1LL;i>=(a);--i) #define clr(a, b) memset((a), (b) ,sizeof(a)) #define ctos(c) string(1,c) #define print(x) cout<<#x<<" = "<>d[0]>>d[1]>>d[2]; rep(i,0,30){ rep(j,0,30){ if(i==j)m[i][j] = 0; else m[i][j] = 1000000000000000000LL; } } vector > > v(3,vector >()); ll start,end; ll index = 0; rep(i,0,3){ v[i].pb(mp(1,index)); index++; } vector > v1; char s[2]; ll t[2]; cin>>s[0]>>t[0]; cin>>s[1]>>t[1]; v1.pb(mp(s[0]-'A',t[0])); v1.pb(mp(s[1]-'A',t[1])); sort(all(v1)); v[v1[0].fi].pb(mp(v1[0].se,index)); start = index; index++; v[v1[1].fi].pb(mp(v1[1].se,index)); end = index; index++; rep(i,0,3){ v[i].pb(mp(d[i],index)); index++; } f(v[0][0].se,v[1][0].se,1); f(v[0][0].se,v[2][0].se,1); f(v[1][0].se,v[2][0].se,1); f(v[0][v[0].sz-1].se,v[1][v[1].sz-1].se,1); f(v[0][v[0].sz-1].se,v[2][v[2].sz-1].se,1); f(v[1][v[1].sz-1].se,v[2][v[2].sz-1].se,1); rep(i,0,3){ rep(j,0,v[i].sz-1){ f(v[i][j].se,v[i][j+1].se,v[i][j+1].fi-v[i][j].fi); } } rep(k,0,30){ rep(i,0,30){ rep(j,0,30){ if(m[i][j] > m[i][k] + m[k][j]){ m[i][j] = m[i][k] + m[k][j]; } } } } cout << m[start][end] << endl; return 0; }