1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <bits/stdc++.h> using namespace std;
char s[100100]; int dp[100100][10]; map<char, string>mp;
int p[6][3] = { 0,1,2, 0,2,1, 1,0,2, 2,0,1, 1,2,0, 2,1,0 };
int cal(string s, string l, int j, int k) { if (s[p[j][0]] == l[p[k][0]] && s[p[j][1]] == l[p[k][1]] && s[p[j][2]] == l[p[k][2]]) return 0; else if (s[p[j][1]] == l[p[k][0]] && s[p[j][2]] == l[p[k][1]]) return 1; else if (s[p[j][2]] == l[p[k][0]]) return 2; return 3; }
int main() { mp['Y'] = "QQQ"; mp['V'] = "QQW"; mp['G'] = "QQE"; mp['C'] = "WWW"; mp['X'] = "QWW"; mp['Z'] = "WWE"; mp['T'] = "EEE"; mp['F'] = "QEE"; mp['D'] = "WEE"; mp['B'] = "QWE";
while (~scanf("%s", s)) { memset(dp, 0x3f, sizeof dp); int ans = 0x3f3f3f; int len = strlen(s); for (int i = 0; i <= 5; i++) { dp[1][i] = 4; }
for (int i = 2; i <= len; i++) { for (int j = 0; j <= 5; j++) { for (int k = 0; k <= 5; k++) { dp[i][j] = min(dp[i][j], dp[i - 1][k] + cal(mp[s[i - 2]], mp[s[i - 1]], k, j) + 1); } } }
for (int i = 0; i <= 5; i++) { ans = min(ans, dp[len][i]); } cout << ans << '\n'; } return 0; }
|