#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

const int MAX_M=2000,MAX_N=2000;

int M,N;
char S[MAX_M+1],T[MAX_N+1];

int s[MAX_M+1],t[MAX_N+1];
int dp[MAX_M+2][MAX_N+2][2];

int main(){
	scanf("%d %d",&M,&N);
	scanf("%s",S);
	scanf("%s",T);
	for (int i=0;i<M;i++){
		s[i]= (S[i]=='I' ? 1 : 0);
	}
	s[M]=-1;
	for (int i=0;i<N;i++){
		t[i]= (T[i]=='I' ? 1 : 0);
	}
	t[N]=-1;
	for (int i=M;i>=0;i--){
		for (int j=N;j>=0;j--){
			//dp[i][j][0]を埋める
			int a;
			if (s[i]==0 && t[j]==0){
				a=max(dp[i][j+1][1]+1,dp[i+1][j][1]+1);
			}
			else if (t[j]==0){
				a=dp[i][j+1][1]+1;
			}
			else if (s[i]==0){
				a=dp[i+1][j][1]+1;
			}
			else{
				a=0;
			}
			dp[i][j][0]=a;
			//dp[i][j][1]を埋める
			if (s[i]==1 && t[j]==1){
				a=max(dp[i][j+1][0]+1,dp[i+1][j][0]+1);
			}
			else if (t[j]==1){
				a=dp[i][j+1][0]+1;
			}
			else if (s[i]==1){
				a=dp[i+1][j][0]+1;
			}
			else{
				a=0;
			}
			dp[i][j][1]=a;
		}
	}
	//最も大きいdp[i][j][1]を求める
	int ma=0;
	for (int i=0;i<M;i++){
		for (int j=0;j<N;j++){
			if (dp[i][j][1]%2==1){
				ma=max(ma,dp[i][j][1]);
			}
			else{
				ma=max(ma,dp[i][j][1]-1);
			}
		}
	}
	printf("%d\n",ma);
	return 0;
}