#include using namespace std; #define int long long #define f(i,a,b) for(int i = (a); i < (b); ++i) struct State { vector next = vector(26, -1); int count = 0; }; struct Trie { vector states = vector (1); void Construct(vector vals) { for (auto &&val : vals) { int state = 0; for (char c : val) { if (states[state].next[c - 'a'] == -1) { states.push_back(State()); states[state].next[c - 'a'] = states.size() - 1; } state = states[state].next[c - 'a']; } } } int Add(string val) { int ret = 0; int state = 0; for (char c : val) { state = states[state].next[c - 'a']; ret += states[state].count++; } return ret; } int Remove(string val) { int ret = 0; int state = 0; for (char c : val) { state = states[state].next[c - 'a']; ret += --states[state].count; } return ret; } }; signed main() { ios_base::sync_with_stdio(0); int n, k; cin >> n >> k; vector vals(n); f(i,0,n) cin >> vals[i]; auto t = Trie(); t.Construct(vals); int ans = 0; int score = 0; int lptr = 0; t.Add(vals[0]); f(i,1,n) { score += t.Add(vals[i]); while (score >= k) score -= t.Remove(vals[lptr++]); ans += lptr; } cout << ans << "\n"; return 0; }