program casino;
Uses sysutils;
{$H+}
const lung=1000000;
type elenco=array[0..lung-1] of int64;
var N,M,w,t,q,coppie,index:Int64;
S,S_ruotate:array[0..lung] of AnsiString;
funz_errore: array[0..100000] of Int64;
H, accoppiata:elenco;
function LexicalMinRotation(var x: AnsiString):Int64;
var
len,K,i,j:Int64;
begin
x:=x+x;
len:=length(x);
for i:=0 to len do funz_errore[i]:=-1;
K:=1;
for j:=2 to len do
begin
i:= funz_errore[j-k-1];
while (i <> -1 ) and (x[j] <> x[(k + i+1 )]) do
begin
if x[j] < x[(k + i+1 )] then k:= j - i - 1;
i:=funz_errore[i];
end;
if (i = -1) and (x[j] <> x[(k + i+1 )]) then
begin
if x[j] < x[(k + i+1 )] then k:= j;
funz_errore[j - k]:= -1;
end
else funz_errore[j - k]:= i + 1;
end;
LexicalMinRotation:=k;
end;
function Rabin (var x: Ansistring) :int64;
var len, i, R,base,d:int64;
begin
d:=1; R:=0; len:=length(x); base:=29;
for i := 1 to len-1 do d := (d * base) mod q ;
for i := 1 to len do R:= (base*R+ord(x[i])) mod q;
Rabin:= R;
end;
Procedure scambia (var a,b: int64);
var x:int64;
begin
x:=a;
a:=b;
b:=x;
end;
Procedure ordinamento (estremoi,estremos: int64; var v : elenco; ordinato:boolean);
var inf, sup, medio:int64;
pivot :int64;
begin
inf:=estremoi;
sup:=estremos;
medio:= (estremoi+estremos) div 2;
pivot:=v[medio];
repeat
if (ordinato) then
begin
while (v[inf]<pivot) do inf:=inf+1;
while (v[sup]>pivot) do sup:=sup-1;
end;
if inf<=sup then
begin
scambia(v[inf],v[sup]);
inf:=inf+1;
sup:=sup-1;
end;
until inf>sup;
if (estremoi<sup) then ordinamento(estremoi,sup,v,ordinato);
if (inf<estremos) then ordinamento(inf,estremos,v,ordinato);
end;
begin
(*assign(input, 'input.txt'); reset(input);
assign(output, 'output.txt'); rewrite(output);*)
readln (N,M);
for w:=0 to N-1 do begin readln(S[w]); S[w]:=Trim(S[w]); H[w]:=0; accoppiata[w]:=0;end;
coppie:=0; q:=101;
for w:=0 to N-1 do
begin
index:=LexicalMinRotation(S[w]);
S_ruotate[w]:=copy(S[w],index,M);
H[w]:=Rabin(S_ruotate[w]);
end;
ordinamento(0,N-1,H,true);
t:=0;
for w:=0 to N-1 do
begin
if H[w]=H[w+1] then accoppiata[t]:=accoppiata[t]+1
else t:=t+1;
end;
for w:=0 to t-1 do
begin
if accoppiata[w] =1 then coppie:=coppie+1
else if accoppiata[w]>1 then coppie:=coppie+((accoppiata[w]+1)*(accoppiata[w]) div 2);
end;
writeln (coppie);
end.
cHJvZ3JhbSBjYXNpbm87IApVc2VzIHN5c3V0aWxzOwp7JEgrfQpjb25zdCBsdW5nPTEwMDAwMDA7CnR5cGUgZWxlbmNvPWFycmF5WzAuLmx1bmctMV0gb2YgaW50NjQ7CnZhciAgTixNLHcsdCxxLGNvcHBpZSxpbmRleDpJbnQ2NDsKICAgICBTLFNfcnVvdGF0ZTphcnJheVswLi5sdW5nXSBvZiBBbnNpU3RyaW5nOwogICAgIGZ1bnpfZXJyb3JlOiBhcnJheVswLi4xMDAwMDBdIG9mIEludDY0OwogICAgIEgsIGFjY29wcGlhdGE6ZWxlbmNvOwogICAgCmZ1bmN0aW9uIExleGljYWxNaW5Sb3RhdGlvbih2YXIgeDogQW5zaVN0cmluZyk6SW50NjQ7CnZhciAKbGVuLEssaSxqOkludDY0OwoKYmVnaW4KICAgeDo9eCt4OyAKICAgbGVuOj1sZW5ndGgoeCk7IAogICBmb3IgaTo9MCB0byBsZW4gZG8gZnVuel9lcnJvcmVbaV06PS0xOyAKICAgSzo9MTsgCiAgIGZvciBqOj0yIHRvIGxlbiBkbyAgIAogICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICBpOj0gZnVuel9lcnJvcmVbai1rLTFdOwogICAgICAgICAgICAgd2hpbGUgKGkgPD4gLTEgKSBhbmQgKHhbal0gPD4geFsoayArIGkrMSApXSkgZG8gICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHhbal0gPCB4WyhrICsgaSsxICldIHRoZW4gazo9IGogLSBpIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTo9ZnVuel9lcnJvcmVbaV07ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpID0gLTEpIGFuZCAoeFtqXSA8PiB4WyhrICsgaSsxICldKSB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeFtqXSA8IHhbKGsgKyBpKzEgKV0gdGhlbiBrOj0gajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bnpfZXJyb3JlW2ogLSBrXTo9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICBmdW56X2Vycm9yZVtqIC0ga106PSBpICsgMTsKICAgICAgICAgICAgICAgCiAgICAgICAgIGVuZDsgICAKIExleGljYWxNaW5Sb3RhdGlvbjo9azsgCiAgICAgCmVuZDsKCmZ1bmN0aW9uIFJhYmluICh2YXIgeDogQW5zaXN0cmluZykgOmludDY0Owp2YXIgbGVuLCBpLCBSLGJhc2UsZDppbnQ2NDsKYmVnaW4KICAgZDo9MTsgUjo9MDsgbGVuOj1sZW5ndGgoeCk7IGJhc2U6PTI5OyAKICAgZm9yIGkgOj0gMSAgdG8gbGVuLTEgZG8gIGQgOj0gKGQgKiBiYXNlKSBtb2QgcSA7CiAgIGZvciBpIDo9IDEgdG8gbGVuIGRvICBSOj0gIChiYXNlKlIrb3JkKHhbaV0pKSBtb2QgcTsgIAogICBSYWJpbjo9IFI7IAplbmQ7IAoKUHJvY2VkdXJlIHNjYW1iaWEgKHZhciBhLGI6IGludDY0KTsKdmFyIHg6aW50NjQ7CmJlZ2luCiAgIHg6PWE7CiAgIGE6PWI7CiAgIGI6PXg7CmVuZDsgIApQcm9jZWR1cmUgb3JkaW5hbWVudG8gKGVzdHJlbW9pLGVzdHJlbW9zOiBpbnQ2NDsgdmFyIHYgOiBlbGVuY287IG9yZGluYXRvOmJvb2xlYW4pOwp2YXIgaW5mLCBzdXAsIG1lZGlvOmludDY0OwogICAgcGl2b3QgOmludDY0OwpiZWdpbgogICAgaW5mOj1lc3RyZW1vaTsKICAgIHN1cDo9ZXN0cmVtb3M7CiAgICBtZWRpbzo9IChlc3RyZW1vaStlc3RyZW1vcykgZGl2IDI7CiAgICBwaXZvdDo9dlttZWRpb107CiAgICByZXBlYXQKICAgICAgaWYgKG9yZGluYXRvKSB0aGVuCiAgICAgICAgIGJlZ2luCiAgICAgICAgICAgIHdoaWxlICh2W2luZl08cGl2b3QpIGRvICBpbmY6PWluZisxOwogICAgICAgICAgICB3aGlsZSAodltzdXBdPnBpdm90KSBkbyAgc3VwOj1zdXAtMTsKICAgICAgICAgZW5kOwogICAgICBpZiBpbmY8PXN1cCB0aGVuCiAgICAgICBiZWdpbgogICAgICAgICBzY2FtYmlhKHZbaW5mXSx2W3N1cF0pOwogICAgICAgICBpbmY6PWluZisxOwogICAgICAgICBzdXA6PXN1cC0xOwogICAgICAgZW5kOwogICAgdW50aWwgaW5mPnN1cDsKICAgIGlmIChlc3RyZW1vaTxzdXApIHRoZW4gb3JkaW5hbWVudG8oZXN0cmVtb2ksc3VwLHYsb3JkaW5hdG8pOwogICAgaWYgKGluZjxlc3RyZW1vcykgdGhlbiBvcmRpbmFtZW50byhpbmYsZXN0cmVtb3MsdixvcmRpbmF0byk7CmVuZDsgICAgCgpiZWdpbgogICAoKmFzc2lnbihpbnB1dCwgJ2lucHV0LnR4dCcpOyByZXNldChpbnB1dCk7CiAgIGFzc2lnbihvdXRwdXQsICdvdXRwdXQudHh0Jyk7IHJld3JpdGUob3V0cHV0KTsqKQogICByZWFkbG4gKE4sTSk7CiAgIGZvciB3Oj0wIHRvIE4tMSBkbyBiZWdpbiByZWFkbG4oU1t3XSk7ICBTW3ddOj1UcmltKFNbd10pOyBIW3ddOj0wOyAgYWNjb3BwaWF0YVt3XTo9MDtlbmQ7CiAgIGNvcHBpZTo9MDsgIHE6PTEwMTsKICBmb3Igdzo9MCB0byBOLTEgZG8KICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgIGluZGV4Oj1MZXhpY2FsTWluUm90YXRpb24oU1t3XSk7CiAgICAgICAgICAgIFNfcnVvdGF0ZVt3XTo9Y29weShTW3ddLGluZGV4LE0pOwogICAgICAgICAgICBIW3ddOj1SYWJpbihTX3J1b3RhdGVbd10pOwogICAgICAgICAgZW5kOyAgCiAgIG9yZGluYW1lbnRvKDAsTi0xLEgsdHJ1ZSk7ICAKICAgdDo9MDsKICAgZm9yIHc6PTAgdG8gTi0xIGRvICAKICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgIGlmIEhbd109SFt3KzFdIHRoZW4gIGFjY29wcGlhdGFbdF06PWFjY29wcGlhdGFbdF0rMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB0Oj10KzE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgZW5kOwogICAgICAgICAgICAgICAgICAKICAgIGZvciB3Oj0wIHRvIHQtMSBkbyAKICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgaWYgYWNjb3BwaWF0YVt3XSA9MSB0aGVuIGNvcHBpZTo9Y29wcGllKzEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiBhY2NvcHBpYXRhW3ddPjEgdGhlbiBjb3BwaWU6PWNvcHBpZSsoKGFjY29wcGlhdGFbd10rMSkqKGFjY29wcGlhdGFbd10pIGRpdiAyKTsKICAgICAgICAgICAgICAgZW5kOwogICAgd3JpdGVsbiAoY29wcGllKTsKZW5kLg==