#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using Int = long long; template ostream &operator<<(ostream &os, const pair &a) { return os << "(" << a.first << ", " << a.second << ")"; }; template ostream &operator<<(ostream &os, const vector &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; } template void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; } template bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; } template bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; } #define COLOR(s) ("\x1b[" s "m") // |as| = n ==> |rs| = 2 n + 1 // [i - rs[i], i + rs[i]] is palindrome for $ as[0] $ as[1] $ ... $ as[n-1] $ // as[i, j): palindrome <=> j - i <= rs[i + j] template vector manacher(const String &as) { const int n = as.size(); vector rs(2 * n + 1); for (int i = 0, j = 0, k; i <= 2 * n; i += k, j -= k) { for (; 0 < i - j && i + j < 2 * n && (!((i + j + 1) & 1) || as[(i - j - 1) >> 1] == as[(i + j + 1) >> 1]); ++j) {} rs[i] = j; for (k = 1; k < j && k + rs[i - k] < j; ++k) rs[i + k] = rs[i - k]; } return rs; } int SLen, TLen; char S[500'010]; char T[500'010]; int main() { for (; ~scanf("%d%d", &SLen, &TLen); ) { scanf("%s", S); scanf("%s", T); bool isPalT = true; isPalT = isPalT && (TLen % 2 == 0); for (int l = 0, r = TLen - 1; l < r; ++l, --r) { isPalT = isPalT && (T[l] == T[r]); } int common = 0; for (int dir = 0; dir < 2; ++dir) { for (int i = 0; ; ++i) { if (!(i < SLen && i < TLen && S[i] == T[i])) { chmax(common, i); break; } } reverse(S, S + SLen); } int ans = -1; if (isPalT) { const auto rs = manacher(string(T, T + TLen/2)); // longest even pal suf vector fs(TLen/2 + 1, 0); for (int i = 0; i <= TLen/2; ++i) chmax(fs[i + rs[i*2] / 2], rs[i*2]); for (int i = TLen/2; --i >= 0; ) chmax(fs[i], fs[i + 1] - 2); //cerr<<"T/2 = "<