#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <utility>
#include <algorithm>
#include <fstream>
#include <queue>
#include <stack>
#include <stdlib.h> 
#include <unordered_set>

#define sz(x) (int)(x).size()
#define el endl

typedef long long ll;
using namespace std;


void sol(){
    int n, m;
    cin >> n>>m;
    string s, t;
    cin >> s >> t;
    vector<int> l,r ;

    int x = 0;
    for (int i = 0; x< m , i < n; i++){
        if (s[i] == t[x]){
            l.push_back(i);
            x++;
        }
    }
    reverse(s.begin(),s.end());
    reverse(t.begin(),t.end());
    x = 0;

    for (int i = 0; x< m , i < n; i++){
        if (s[i] == t[x]){
            r.push_back(n - i - 1);
            x++;
        }
    }
    reverse(r.begin(),r.end());
    int sol = 0;
    for (int i = 1; i < r.size(); i++){
        sol = max(sol, r[i] - l[i - 1]);
    }
    cout << sol << el;
    return ;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int t = 1;
	while(t--){
	//	cout << t<<el;
		sol();
	}
}

//                 *

//              *  _|_
//              .-' * '-. *
//             /       * \
//          *  ^^^^^|^^^^^
//              .~. |  .~.
//             / ^ \| / ^ \
//            (|   |J/|   |)
//            '\   /`"\   /`
//  -- '' -'-'  ^`^    ^`^  -- '' -'-' 