#include using namespace std; #define FOR(i, a, b) for (int i = (int)(a); i < (int)(b); ++i) #define REP(i, n) FOR(i, 0, n) #define TRACE(x) cerr << #x << " = " << x << endl #define _ << " _ " << #define pb push_back #define x first #define y second #define LT < #define GT > typedef long long ll; typedef long double lf; const int MAXN = 1001000; char s[MAXN]; char w[MAXN]; int G[5][5]; bool bio[5]; vector cyc; void dfs(int x) { if (bio[x]) return; bio[x] = true; cyc.push_back(x); REP(y, 4) { if (x == y || G[x][y] == 0) continue; dfs(y); break; } } int kod(char c) { if (c == 'A') return 0; if (c == 'C') return 1; if (c == 'G') return 2; if (c == 'T') return 3; assert(false); return -1; } bool can(int x) { REP(i, 4) if (G[x][i] > 0) return true; return false; } int main(void) { scanf("%s", s); scanf("%s", w); const int sz = strlen(s); REP(i, sz) { int x = kod(s[i]); int y = kod(w[i]); if (x == y) continue; G[x][y]++; } int ans = 0; REP(i, 4) { REP(j, i) { int k = min(G[i][j], G[j][i]); ans += k; G[i][j] -= k; G[j][i] -= k; } } REP(iter, 20) { memset(bio, 0, sizeof bio); REP(i, 4) { if (!can(i)) continue; cyc.clear(); dfs(i); if (cyc.size() < 2u) continue; int k = G[cyc[0]][cyc[1]]; REP(j, cyc.size()) { int jn = (j + 1) % (int)cyc.size(); k = min(k, G[cyc[j]][cyc[jn]]); } REP(j, cyc.size()) { int jn = (j + 1) % (int)cyc.size(); G[cyc[j]][cyc[jn]] -= k; } ans += (int)(cyc.size() - 1) * k; } } printf("%d\n", ans); return 0; }