program casino;
Uses sysutils;
{$H+}
const lung=1000000;
type elenco=array[0..lung-1] of int64;
var N,M,w,t,coppie,index:Int64;
S,S_ruotate:array[0..lung] of AnsiString;
funz_errore: array[0..2000000] 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,h,d, q:int64;
begin
h:=1; R:=0; len:=length(x); q:=MaxInt; d:=26;
for i := 1 to len-1 do h := (h * d) mod q;
for i := 1 to len do begin R:= R+ ((ord(x[i])*h) mod q); h:=h div d; end;
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;
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.
cHJvZ3JhbSBjYXNpbm87IApVc2VzIHN5c3V0aWxzOwp7JEgrfQpjb25zdCBsdW5nPTEwMDAwMDA7CnR5cGUgZWxlbmNvPWFycmF5WzAuLmx1bmctMV0gb2YgaW50NjQ7CnZhciAgTixNLHcsdCxjb3BwaWUsaW5kZXg6SW50NjQ7CiAgICAgUyxTX3J1b3RhdGU6YXJyYXlbMC4ubHVuZ10gb2YgQW5zaVN0cmluZzsKICAgICBmdW56X2Vycm9yZTogYXJyYXlbMC4uMjAwMDAwMF0gb2YgSW50NjQ7CiAgICAgSCwgYWNjb3BwaWF0YTplbGVuY287CiAgICAKZnVuY3Rpb24gTGV4aWNhbE1pblJvdGF0aW9uKHZhciB4OiBBbnNpU3RyaW5nKTpJbnQ2NDsKdmFyIApsZW4sSyxpLGo6SW50NjQ7CgpiZWdpbgogICB4Oj14K3g7IAogICBsZW46PWxlbmd0aCh4KTsgCiAgIGZvciBpOj0wIHRvIGxlbiBkbyBmdW56X2Vycm9yZVtpXTo9LTE7IAogICBLOj0xOyAKICAgZm9yIGo6PTIgdG8gbGVuIGRvICAgCiAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgIGk6PSBmdW56X2Vycm9yZVtqLWstMV07CiAgICAgICAgICAgICB3aGlsZSAoaSA8PiAtMSApIGFuZCAoeFtqXSA8PiB4WyhrICsgaSsxICldKSBkbyAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeFtqXSA8IHhbKGsgKyBpKzEgKV0gdGhlbiBrOj0gaiAtIGkgLSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOj1mdW56X2Vycm9yZVtpXTsgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGkgPSAtMSkgYW5kICh4W2pdIDw+IHhbKGsgKyBpKzEgKV0pIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB4W2pdIDwgeFsoayArIGkrMSApXSB0aGVuIGs6PSBqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuel9lcnJvcmVbaiAtIGtdOj0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgIGZ1bnpfZXJyb3JlW2ogLSBrXTo9IGkgKyAxOwogICAgICAgICAgICAgICAKICAgICAgICAgZW5kOyAgIAogTGV4aWNhbE1pblJvdGF0aW9uOj1rOyAKICAgICAKZW5kOwoKZnVuY3Rpb24gUmFiaW4gKHZhciB4OiBBbnNpc3RyaW5nKSA6aW50NjQ7CnZhciBsZW4sIGksIFIsaCxkLCBxOmludDY0OwpiZWdpbgogICBoOj0xOyBSOj0wOyBsZW46PWxlbmd0aCh4KTsgcTo9TWF4SW50OyBkOj0yNjsKICAgZm9yIGkgOj0gMSAgdG8gbGVuLTEgZG8gIGggOj0gKGggKiBkKSBtb2QgcTsKICAgZm9yIGkgOj0gMSB0byBsZW4gZG8gIGJlZ2luIFI6PSBSKyAoKG9yZCh4W2ldKSpoKSBtb2QgcSk7IGg6PWggZGl2IGQ7IGVuZDsKICAgUmFiaW46PSBSOyAKZW5kOyAKClByb2NlZHVyZSBzY2FtYmlhICh2YXIgYSxiOiBpbnQ2NCk7CnZhciB4OmludDY0OwpiZWdpbgogICB4Oj1hOwogICBhOj1iOwogICBiOj14OwplbmQ7ICAKUHJvY2VkdXJlIG9yZGluYW1lbnRvIChlc3RyZW1vaSxlc3RyZW1vczogaW50NjQ7IHZhciB2IDogZWxlbmNvOyBvcmRpbmF0bzpib29sZWFuKTsKdmFyIGluZiwgc3VwLCBtZWRpbzppbnQ2NDsKICAgIHBpdm90IDppbnQ2NDsKYmVnaW4KICAgIGluZjo9ZXN0cmVtb2k7CiAgICBzdXA6PWVzdHJlbW9zOwogICAgbWVkaW86PSAoZXN0cmVtb2krZXN0cmVtb3MpIGRpdiAyOwogICAgcGl2b3Q6PXZbbWVkaW9dOwogICAgcmVwZWF0CiAgICAgIGlmIChvcmRpbmF0bykgdGhlbgogICAgICAgICBiZWdpbgogICAgICAgICAgICB3aGlsZSAodltpbmZdPHBpdm90KSBkbyAgaW5mOj1pbmYrMTsKICAgICAgICAgICAgd2hpbGUgKHZbc3VwXT5waXZvdCkgZG8gIHN1cDo9c3VwLTE7CiAgICAgICAgIGVuZDsKICAgICAgaWYgaW5mPD1zdXAgdGhlbgogICAgICAgYmVnaW4KICAgICAgICAgc2NhbWJpYSh2W2luZl0sdltzdXBdKTsKICAgICAgICAgaW5mOj1pbmYrMTsKICAgICAgICAgc3VwOj1zdXAtMTsKICAgICAgIGVuZDsKICAgIHVudGlsIGluZj5zdXA7CiAgICBpZiAoZXN0cmVtb2k8c3VwKSB0aGVuIG9yZGluYW1lbnRvKGVzdHJlbW9pLHN1cCx2LG9yZGluYXRvKTsKICAgIGlmIChpbmY8ZXN0cmVtb3MpIHRoZW4gb3JkaW5hbWVudG8oaW5mLGVzdHJlbW9zLHYsb3JkaW5hdG8pOwplbmQ7ICAgIAoKYmVnaW4KICAgKCphc3NpZ24oaW5wdXQsICdpbnB1dC50eHQnKTsgcmVzZXQoaW5wdXQpOwogICBhc3NpZ24ob3V0cHV0LCAnb3V0cHV0LnR4dCcpOyByZXdyaXRlKG91dHB1dCk7KikKICAgcmVhZGxuIChOLE0pOwogICBmb3Igdzo9MCB0byBOLTEgZG8gYmVnaW4gcmVhZGxuKFNbd10pOyAgU1t3XTo9VHJpbShTW3ddKTsgSFt3XTo9MDsgIGFjY29wcGlhdGFbd106PTA7ZW5kOwogICBjb3BwaWU6PTA7ICAKICBmb3Igdzo9MCB0byBOLTEgZG8KICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgIGluZGV4Oj1MZXhpY2FsTWluUm90YXRpb24oU1t3XSk7CiAgICAgICAgICAgIFNfcnVvdGF0ZVt3XTo9Y29weShTW3ddLGluZGV4LE0pOwogICAgICAgICAgICBIW3ddOj1SYWJpbihTX3J1b3RhdGVbd10pOwogICAgICAgICAgZW5kOwogIAogICBvcmRpbmFtZW50bygwLE4tMSxILHRydWUpOyAgCiAgIHQ6PTA7CiAgIGZvciB3Oj0wIHRvIE4tMSBkbyAgCiAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICBpZiBIW3ddPUhbdysxXSB0aGVuICBhY2NvcHBpYXRhW3RdOj1hY2NvcHBpYXRhW3RdKzEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHQ6PXQrMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgICAgICAgIAogICAgZm9yIHc6PTAgdG8gdC0xIGRvIAogICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICBpZiBhY2NvcHBpYXRhW3ddID0xIHRoZW4gY29wcGllOj1jb3BwaWUrMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIGFjY29wcGlhdGFbd10+MSB0aGVuIGNvcHBpZTo9Y29wcGllKygoYWNjb3BwaWF0YVt3XSsxKSooYWNjb3BwaWF0YVt3XSkgZGl2IDIpOwogICAgICAgICAgICAgICBlbmQ7CiAgICB3cml0ZWxuIChjb3BwaWUpOwplbmQuCg==