#include <bits/stdc++.h>
#pragma comment(linker, "/stack:640000000")
using namespace std;
const double EPS = 1e-9;
const int INF = 0x7f7f7f7f;
const double PI = acos(-1.0);
template <class T>
inline T _abs(T n) {
  return ((n) < 0 ? -(n) : (n));
}
template <class T>
inline T _max(T a, T b) {
  return (!((a) < (b)) ? (a) : (b));
}
template <class T>
inline T _min(T a, T b) {
  return (((a) < (b)) ? (a) : (b));
}
template <class T>
inline T _swap(T &a, T &b) {
  a = a ^ b;
  b = a ^ b;
  a = a ^ b;
}
template <class T>
inline T gcd(T a, T b) {
  return (b) == 0 ? (a) : gcd((b), ((a) % (b)));
}
template <class T>
inline T lcm(T a, T b) {
  return ((a) / gcd((a), (b)) * (b));
}
template <typename T>
string NumberToString(T Number) {
  ostringstream second;
  second << Number;
  return second.str();
}
struct debugger {
  template <typename T>
  debugger &operator,(const T &v) {
    cerr << v << " ";
    return *this;
  }
} dbg;
int n, m, k;
string s, t;
int dp[1005][1005][12][2];
int call(int lft, int rght, int val, int flag) {
  if (val < 0) return -INF;
  if (lft >= n || rght >= m) {
    return val == 0 ? 0 : -INF;
  }
  int &ret = dp[lft][rght][val][flag];
  if (ret != -1) return ret;
  int ans = 0;
  if (s[lft] == t[rght]) {
    ans = call(lft + 1, rght + 1, flag == 0 ? val - 1 : val, 1) + 1;
    ans = max(ans, call(lft + 1, rght + 1, flag == 0 ? val - 1 : val, 0) + 1);
  }
  ans = max(ans, call(lft + 1, rght, val, 0));
  ans = max(ans, call(lft, rght + 1, val, 0));
  return ret = ans;
}
int main() {
  int k;
  while (~scanf("%d%d%d", &n, &m, &k)) {
    memset(dp, -1, sizeof(dp));
    cin >> s >> t;
    printf("%d\n", call(0, 0, k, 0));
  }
  return 0;
}
