program writing;
{$mode objfpc}
uses
SysUtils;
type
TOneData = record
Have : boolean;
Count : integer;
end;
var
Glyph : array[65..122] of TOneData;
Sequence : array[1..3000000] of integer;
Glyph_Len : integer;
Sequence_Len : longint; i : integer;
procedure LoadData(FileName : string);
var
fText : TextFile;
i : integer;
TempChar : Char;
begin
AssignFile(fText, FileName);
Reset(fText);
Readln(fText, Glyph_Len, Sequence_Len);
for i := 1 to Glyph_Len do
begin
Read(fText, TempChar);
Glyph[Ord(TempChar)].Have := true;
Inc(Glyph[Ord(TempChar)].Count)
end;
Readln(fText, TempChar); // Uklanjamo #13
for i := 1 to Sequence_Len do
begin
Read(fText, TempChar);
Sequence[i] := Ord(TempChar);
end;
CloseFile(fText);
end;
procedure Add(Sender : integer);
begin
if Glyph[Sender].Have then
Inc(Glyph[Sender].Count);
end;
function DoWriting : integer;
var
Last, First : integer;
i, j : integer;
check : boolean;
begin
Last := 1;
First := 0;
Result := 0;
for i := 1 to Sequence_Len - Glyph_Len + 1 do
begin
if First > i then
begin
Add(Sequence[i]);
continue;
end;
Check := true;
for j := Last to i + Glyph_Len - 1 do
begin
if not Glyph[Sequence[j]].Have then
begin
Last := j + 1;
First := Last;
Check := false;
Break;
end;
if Glyph[Sequence[j]].Count = 0 then
begin
Last := j;
Check := false;
Break;
end;
Dec(Glyph[Sequence[j]].Count);
end;
if Check then
begin
Inc(Result);
Last := i + Glyph_Len;
end;
Add(Sequence[i]);
end;
end;
procedure SaveData(Filename : string);
var
fText : TextFile;
begin
AssignFile(fText, FileName);
Rewrite(fText);
Writeln(fText, DoWriting);
CloseFile(fText);
end;
begin
LoadData('writing.in');
SaveData('writing.out');
end.