#include #include #include #include using namespace std; vector tab[4][4]; string a, b; bool test(int i) { return a[i] == b[i]; } bool is(vector t, int x) { for (int i = 0; i < (int)t.size(); ++i) { if (t[i] == x) return true; } return false; } int main() { cin >> a >> b; for (int i = 0; i < (int)a.size(); ++i) { if (a[i] == 'A') a[i] = 0; if (a[i] == 'C') a[i] = 1; if (a[i] == 'G') a[i] = 2; if (a[i] == 'T') a[i] = 3; if (b[i] == 'A') b[i] = 0; if (b[i] == 'C') b[i] = 1; if (b[i] == 'G') b[i] = 2; if (b[i] == 'T') b[i] = 3; } for (int i = 0; i < (int)a.size(); ++i) { tab[a[i]][b[i]].push_back(i); } /*for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { cout << i << " " << j << ": " << tab[i][j].size() << endl; } }*/ /*int answer = 0; for (int i = 0; i < (int)a.size(); ++i) { if (!test(i)) { while (!tab[b[i]][a[i]].empty()) { int x = tab[b[i]][a[i]].back(); if (test(x)) { tab[b[i]][a[i]].pop_back(); } else { swap(a[i], a[x]); tab[b[i]][a[i]].pop_back(); break; } } } }*/ queue > que; vector tmp; tmp.push_back(0); for (int i = 0; i < 4; ++i) { tmp[0] = i; que.push(tmp); } int answer = 0; while (!que.empty()) { auto T = que.front(); que.pop(); //cout << T.size() << endl; for (int i = 0; i < 4; ++i) { if (i == T[0]) { /*if (T.size() == 2 && T[0] == 2 && T[1] == 3) { for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { cout << i << " " << j << ": " << tab[i][j].size() << endl; } } }*/ //cout << tab[T.back()][T[0]].size() << endl; int x = tab[T.back()][T[0]].size(); for (int j = 0; j < (int)T.size()-1; ++j) { x = min(x, (int)tab[T[j]][T[j+1]].size()); //cout << T[j] << " " << T[i+1] << " " << tab[T[i]][T[i+1]].size() << endl; } for (int j = 0; j < (int)T.size()-1; ++j) { int X = x; while (X--) { tab[T[j]][T[j+1]].pop_back(); } } int X = x; while (X--) { tab[T.back()][T[0]].pop_back(); } answer += ((int)T.size() - 1) * x; /*cout << x << ": "; for (int k = 0; k < T.size(); ++k) cout << T[k]; cout << endl;*/ } if (!is(T, i)) { tmp = T; tmp.push_back(i); que.push(tmp); } } } printf("%d\n", answer); }