#include using namespace std; using ll = long long; using ld = long double; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef pair pii; typedef vector vi; void ProGamerMove() { int n, k; cin >> n >> k; vector s(n); for (auto& v : s) cin >> v; vector a(n - 1), b(n - 1); ll cur = 0, sb = 0, sa = 0, res = 0; int j = 0; for (int i = 0; i < n - 1; ++i) { while (cur < k && j + 1 < n) { ++j; while (a[j - 1] < s[j - 1].size() && a[j - 1] < s[j].size() && s[j][a[j - 1]] == s[j - 1][a[j - 1]] && (j == 1 || a[j - 2] > a[j - 1])) { ++sa; ++a[j - 1]; } while (b[j - 1] < s[j - 1].size() && b[j - 1] < s[j].size() && s[j][b[j - 1]] == s[j - 1][b[j - 1]]) { ++sb; ++b[j - 1]; } for (int nj = j - 2; nj >= 0; --nj) { if (b[nj] <= b[nj + 1]) break; sb -= b[nj] - b[nj + 1]; b[nj] = b[nj + 1]; } cur += sb; } if (cur < k) break; res += n - j; cur -= sa; a[i] = INT_MAX; for (int ni = i + 1; ni < j; ++ni) { bool up = false; while (a[ni] < s[ni].size() && a[ni] < s[ni + 1].size() && s[ni][a[ni]] == s[ni + 1][a[ni]] && a[ni - 1] > a[ni]) { ++sa; ++a[ni]; up = true; } if (!up) break; } } cout << res << '\n'; } int main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); int tc = 1; // cin >> tc; while(tc--) ProGamerMove(); }