class in{struct myIterator{int it;const bool rev;explicit constexpr myIterator(int it_, bool rev=false):it(it_),rev(rev){}int operator*(){return it;}bool operator!=(myIterator& r){return it!=r.it;}void operator++(){rev?--it:++it;}};const myIterator i,n;public:explicit constexpr in(int n):i(0),n(n){}explicit constexpr in(int i,int n):i(i,n<i),n(n){}const myIterator& begin(){return i;}const myIterator& end(){return n;}};

#include <bits/stdc++.h>
using namespace std;

int dp[2001][2001]; //I
int dp2[2001][2001]; //OI
int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int n, m;
    cin >> n >> m;
    string s, t;
    cin >> s >> t;
    int ans = 0;
    for(int i : in(n + 1)) for(int j : in(m + 1)) {
        ans = max(ans, dp[i][j]);
        if(i < n) {
            if(s[n - i - 1] == 'I')
              dp[i + 1][j] = max(dp[i + 1][j], dp2[i][j] + 1);
            else if(dp[i][j] > 0)
              dp2[i + 1][j] = max(dp2[i + 1][j], dp[i][j] + 1);
        }
        if(j < m) {
            if(t[m - j - 1] == 'I')
              dp[i][j + 1] = max(dp[i][j + 1], dp2[i][j] + 1);
            else if(dp[i][j] > 0)
              dp2[i][j + 1] = max(dp2[i][j + 1], dp[i][j] + 1);
        }
    }
    cout << ans << endl;
    return 0;
}