void main(){
  import std.stdio, std.string, std.conv, std.algorithm;

  int n, m; rd(n, m);
  auto s=readln.chomp.to!(char[]);
  auto t=readln.chomp.to!(char[]);

  auto dp=new int[][][][](n+1, m+1, 2, 2);
  for(int i=0; i<=n; i++)for(int j=0; j<=m; j++)
    foreach(k; 0..2)foreach(l; 0..2) dp[i][j][k][l]=-1;
  dp[0][0][1][0]=0;
  for(int i=0; i<=n; i++)for(int j=0; j<=m; j++){
    foreach(l; 0..2){
      if(i<n) chmax(dp[i+1][j][1][l], dp[i][j][1][l]);
      if(j<m) chmax(dp[i][j+1][1][l], dp[i][j][1][l]);
    }
    if(i<n){
      if(s[i]=='I'){
        if(dp[i][j][1][0]>=0) chmax(dp[i+1][j][0][1], dp[i][j][1][0]+1);
        if(dp[i][j][0][0]>=0) chmax(dp[i+1][j][0][1], dp[i][j][0][0]+1);
      }else{
        if(dp[i][j][1][1]>=0) chmax(dp[i+1][j][0][0], dp[i][j][1][1]+1);
        if(dp[i][j][0][1]>=0) chmax(dp[i+1][j][0][0], dp[i][j][0][1]+1);      
      }
    }
    if(j<m){
      if(t[j]=='I'){
        if(dp[i][j][1][0]>=0) chmax(dp[i][j+1][0][1], dp[i][j][1][0]+1);
        if(dp[i][j][0][0]>=0) chmax(dp[i][j+1][0][1], dp[i][j][0][0]+1);
      }else{
        if(dp[i][j][1][1]>=0) chmax(dp[i][j+1][0][0], dp[i][j][1][1]+1);
        if(dp[i][j][0][1]>=0) chmax(dp[i][j+1][0][0], dp[i][j][0][1]+1);  
      }
    }
  }

  int mx=0;
  for(int i=1; i<=n; i++)for(int j=1; j<=m; j++){
    mx=max(mx, max(dp[i][j][0][1], dp[i][j][1][1]));
  }

  writeln(mx);
}

void chmax(T)(ref T l, T r){if(l<r)l=r;}

void rd(T...)(ref T x){
  import std.stdio, std.string, std.conv;
  auto l=readln.split;
  assert(l.length==x.length);
  foreach(i, ref e; x){
    e=l[i].to!(typeof(e));
  }
}
