#include <bits/stdc++.h>
#include <iostream>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <vector>
#include <list>
#include <deque>
#define rep(i,n) for (register int i = 1; i <= n; i++ )
#define fo(i,x,y) for (register int i = x; i <= y; i++ )
#pragma GCC optimize(3)
using namespace std;
template <class T> inline void read(register T &x)
{
register long long flag = 1;
x = 0; register char ch = getchar();
for( ; !isdigit(ch) ; ch = getchar() ) if(ch == '-') flag = -1;
for( ; isdigit(ch) ; ch = getchar() ) x = (x << 1) + (x << 3) + (ch ^ 48);
x *= flag;
}
template <class T> inline void write(register T x)
{
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
template <class T> inline void writeln(register T x)
{
write(x);
puts("");
}
template <class T> inline T Check_Max(register T a, register T b)
{
return a > b ? a : b;
}
enum
{
MAXN = 110
};
string str[MAXN], Temp;
int n, m, len, ans, t[10];
map <string, int> _Hash;
inline int Doit()
{
for (register int i = 0; i < 8; i++ )
if(t[t[i]] ^ t[i]) return 0;
_Hash.clear();
for (register int i = 1; i <= n; i++ )
{
for (register int j = 0; j < len; j++ )
Temp[j] = t[str[i][j] - 97] + 97;
_Hash[Temp]++;
}
register int Result = 0;
map <string, int> :: iterator iter;
for (iter = _Hash.begin(); iter != _Hash.end(); iter++)
Result += iter -> second * (iter -> second - 1) >> 1;
return Result;
}
inline void DFS(register int Step, register int Now)
{
if (Now > m) return;
if (Step == 8)
{
ans = Check_Max(ans, Doit());
return;
}
for (register int i = 0; i <= Step; i++ )
{
t[Step] = i; DFS(Step + 1, (i != Step) + Now);
}
}
int main(void)
{
read(n); read(len); read(m);
if (m > 6)
{
writeln(n * (n - 1) >> 1);
return 0;
}
Temp.resize(len);
for (register int i = 1; i <= n; i++ )
cin >> str[i];
DFS(0, 0);
writeln(ans);
return 0;
}