Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program solve;
- {$O-}
- type tlong = array[0..100] of byte;
- var
- syms: array[1..500] of byte;
- matr: array[0..320, 0..320] of tlong;
- len, k, i, j, i2: longint;
- st1: string;
- procedure add(a, b: byte);
- var i: byte;
- begin
- for i := 1 to b do
- begin
- inc(k);
- syms[k] := a;
- end;
- end;
- procedure addlong(var a, b: tlong);
- var i, per, n: integer;
- begin
- if (a[0] = 0) and (b[0] = 0) then exit;
- a[0] := 1;
- per := 0;
- for i := 1 to 100 do
- begin
- n := a[i] + b[i] + per;
- a[i] := n mod 10;
- per := n div 10;
- end;
- end;
- procedure writelong(var a: tlong);
- var i: integer;
- fl: boolean;
- begin
- if (a[0] = 0) then
- begin
- write(0);
- exit;
- end;
- fl := false;
- for i := 100 downto 1 do
- begin
- if a[i] <> 0 then fl := true;
- if fl then write(a[i]);
- end;
- end;
- begin
- assign(input, 'input.txt');
- reset(input);
- assign(output, 'output.txt');
- rewrite(output);
- readln(len);
- readln(st1);
- k := 0;
- for i := 1 to length(st1) do
- begin
- case st1[i] of
- 'A': add(1, 1);
- 'B': add(1, 2);
- 'C': add(1, 3);
- 'D': add(2, 1);
- 'E': add(2, 2);
- 'F': add(2, 3);
- 'G': add(3, 1);
- 'H': add(3, 2);
- 'I': add(3, 3);
- 'J': add(4, 1);
- 'K': add(4, 2);
- 'L': add(4, 3);
- 'M': add(5, 1);
- 'N': add(5, 2);
- 'O': add(5, 3);
- 'P': add(6, 1);
- 'Q': add(6, 2);
- 'R': add(6, 3);
- 'S': add(6, 4);
- 'T': add(7, 1);
- 'U': add(7, 2);
- 'V': add(7, 3);
- 'W': add(8, 1);
- 'X': add(8, 2);
- 'Y': add(8, 3);
- 'Z': add(8, 4);
- end;
- end;
- matr[0, 0][1] := 1;
- matr[0, 0][0] := 1;
- for i := 1 to k do
- begin
- if syms[i] in [1..5,7] then
- begin
- for j := 1 to 3 do
- if (i - j >= 0) and (syms[i - j + 1] = syms[i]) then
- begin
- for i2 := 0 to 320 do if matr[i - j, i2][0] = 1 then break;
- while (i2 <= 320) and (matr[i - j, i2][0] = 1) do
- begin
- addlong(matr[i, i2 + 1], matr[i - j, i2]);
- inc(i2);
- end;
- end else break;
- end else
- begin
- for j := 1 to 4 do
- if (i - j >= 0) and (syms[i - j + 1] = syms[i]) then
- begin
- for i2 := 0 to 320 do if matr[i - j, i2][0] = 1 then break;
- while (i2 <= 320) and (matr[i - j, i2][0] = 1) do
- begin
- addlong(matr[i, i2 + 1], matr[i - j, i2]);
- inc(i2);
- end;
- end else break;
- end;
- end;
- writelong(matr[k, len]);
- close(input);
- close(output);
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement