//?????°??¢??°????????°??????????????????????????§DP?????????????????????????????????
//??????????????£????????????????????¨???????????¶????????????????????°????????\??¬????????§?????§????????????????????§???????????¢??????????????????
//??????S, T????????£?????????????????°??¨???????????????????????£???????????§???????????????????????°??????????????°??¢??°????????£??????IOI????????¨???????????????????????§?????????
//?????¨???????????§???????????¶???????????°??????????????£?????¨???????????¢??????????????????????????°O(NM(N+M))?????????????????????
//?????????
//IOI????????¨??????????????????????????????????????????(??°???DP?????´?????????????????????????????§??????????????¨?????????????????§?????????
//S, T????????£?????????????????°x, y??¨?¬???????????????????????????????(I???O)??????????????????????????§????????£????????????????????????????????????
//???????????????????????????????????????????????°???????????????????????????
//?????°???????????????????????\???????????§????????°??§???????????¨???????????¨???O(NM)????????§???DP??????????????????????????????????????????????????????????????????????????¢??°????????????
//????????????????????????????????¨????????????DP?????????????????????????????????????????£??????????????????????????????????????????????£???§?????????
//??¢?????????????????¶??????????????????????\???°, ?????????I)????????????????????????main??´??§??????????????´?????????
//IOI???????????????
//
#include <iostream>
#include <string>
using namespace std;

int m, n;
string s, t;
int dp[2001][2001][2];

//s[x]??????OK, t[y]??????OK, ?¬????c?????£???
int dfs(int x, int y, char c){		
	if( x >= m && y >= n )
		return 0;
	
	if( dp[x][y][c=='I'] > 0 )
		return dp[x][y][c=='I'];
		
	int ret = 0;
	if( x < m && s[x] == c )
		ret = max(ret, dfs(x + 1, y, c == 'I' ? 'O' : 'I') + 1);
	if( y < n && t[y] == c )
		ret = max(ret, dfs(x, y + 1, c == 'I' ? 'O' : 'I') + 1);
	return (dp[x][y][c=='I'] = ret);
}

int main(){
	int ans = 0;
	
	cin >> m >> n >> s >> t;
	for( int i = 0; i < m; i++ ){
		for( int j = 0; j < n; j++ ){
			dp[0][i][j] = -1;
			dp[1][i][j] = -1;
		}
	}
	
	for( int i = 0; i < m; i++ ){
		for( int j = 0; j < n; j++ ){
			ans = max(ans, dfs(i, j, 'I'));
		}
	}
	if( ans > 0 ){
		ans -= (ans + 1) % 2;	//?\???°????????????
	}
	cout << ans << endl;
	return 0;
}