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

template<typename T1,typename T2> void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> void chmax(T1 &a,T2 b){if(a<b) a=b;}


template<typename T>
vector<T> make_v(size_t a){return vector<T>(a);}
template<typename T>
vector<vector<T> > make_v(size_t a,size_t b){
  return vector<vector<T> >(a,make_v<T>(b));
}
template<typename T>
vector<vector<vector<T> > > make_v(size_t a,size_t b,size_t c){
  return vector<vector<vector<T> > > (a,make_v<T>(b,c));
}

template<typename T,typename V>
typename enable_if<is_class<T>::value==0>::type
fill_v(T &t,const V &v){t=v;}

template<typename T,typename V>
typename enable_if<is_class<T>::value!=0>::type
fill_v(T &t,const V &v){
  for(auto &e:t) fill_v(e,v);
}

//INSERT ABOVE HERE
signed main(){
  Int n,m;
  string s,t;
  cin>>n>>m>>s>>t;
  Int ans=0;
  auto dp=make_v<Int>(2,n+1,m+1);
  fill_v(dp,-1);
  
  function<Int(Int,Int,Int)> dfs=[&](Int f,Int a,Int b){
    Int &res=dp[f][a][b];
    if(~res) return res;
    res=0;
    
    if(a<n&&s[a]=="IO"[f]) chmax(res,1+dfs(!f,a+1,b));
    if(b<m&&t[b]=="IO"[f]) chmax(res,1+dfs(!f,a,b+1));
    
    chmax(ans,(res&1)?res:res-1);
    return res;
  };

  for(Int i=0;i<=n;i++)
    for(Int j=0;j<=m;j++)
      dfs(0,i,j);
  
  cout<<ans<<endl;
  return 0;
}

