вівторок, 21 листопада 2017 р.

Завдання IІ етапу Всеукраїнської учнівської олімпіади

з інформатики 2017/2018 н.р.

Задача A. Покер (100 балів)
Ім’я вхідного файлу: іnput.txt
Ім’я вхідного файлу: output.txt
Ліміт часу: 1с.
Задано 5 цілих чисел. Серед них:
·        якщо однакові 5, то вивести "Impossible", інакше
·        якщо однакові 4, то вивести "Four of a Kind", інакше
·        якщо однакові 3 и 2, то вивести "Full House", інакше
·        якщо є 5 послідовних, то вивести "Straight", інакше
·        якщо однакові 3, то вивести "Three of a Kind", інакше
·        якщо однакові 2 і 2, то вивести "Two Pairs", інакше
·        якщо однакові 2, то вивести "One Pair", інакше
·        вивести "Nothing".
Вхідні дані
У першому рядку задано 5 чисел (від 1 до 13 включно) через пропуск.
Вихідні дані
Виводиться один рядок - результат аналізу.
Приклади
іnput.txt
output.txt
1 3 9 3 2

One Pair

1 5 5 4 4

Two Pairs

10 11 12 13 1

Nothing


Вже з умови видно, що для розв'зання даної задачі потрібно застосувати розгалуження, порівнюючи 5 вхідних чисел. Звичайно, найпростіше перевірити рівність всіх п'яти чисел. Навіть, не знаючи формул комбінаторики, можна перебрати всі варіанти і в решти випадків. Найскладніше визначити чи є 5 послідовних чисел. Якби ці числа йшли за порядком, то це було б дуже просто, а якщо ж порядок не не суттєвий то перебрати всі варіанти тяжко, так як розміщень даних чисел може бути аж 5! Без урахування порядку, та використовуючи модуль, можна зменшити кількість варіантів. Ото ж, програма в Delphi може бути такою:

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

label 1;
var
 f,g:text;i,a,b,c,d,e:byte;
begin
  assign(f,'input.txt');
  assign(g,'output.txt');
  reset(f);
  rewrite(g);
  read(f,a,b,c,d,e);
  if (abs((a-b)*(b-c)*(c-d)*(d-e))=1)or(abs((a-e)*(b-c)*(c-d)*(d-e))=1)
  or(abs((a-e)*(b-a)*(c-d)*(d-e))=1)or(abs((a-e)*(b-c)*(a-b)*(d-e))=1)
  or(abs((a-e)*(b-c)*(c-d)*(d-e))=1)or(abs((a-c)*(c-d)*(d-e)*(e-b))=1)
  or(abs((a-c)*(c-d)*(d-b)*(b-e))=1)or(abs((b-c)*(c-d)*(d-a)*(a-e))=1)
  or(abs((b-c)*(c-a)*(a-d)*(d-e))=1)or(abs((b-a)*(a-c)*(c-d)*(d-e))=1)
  or(abs((c-b)*(b-a)*(a-d)*(d-e))=1)        {це не всі варіанти}
  then begin   then begin  write(g,'Straight'); goto 1 end;
  if (a=b)and(a=c)and(a=d)and(a=e) then begin write(g,'Impossible');goto 1 end else
  if ((a=b)and(a=c)and(a=d))or((a=b)and(a=c)and(a=e))or
  ((a=b)and(a=e)and(a=d))or((a=d)and(a=c)and(a=e))or((d=b)and(b=c)and(b=e))
  or((a=b)and(a=c)and(a=e)) then begin write(g,'Four of a Kind');goto 1 end else
  if ((a=b)and(a=c)and(d=e))or((a=b)and(a=d)and(c=e))or
  ((a=b)and(a=e)and(d=c))or((b=c)and(b=d)and(a=e))or((b=d)and(b=e)and(a=c))
  or((c=d)and(c=e)and(a=b))or((a=c)and(a=d)and(b=e))or((a=d)and(a=e)and(b=c))
  or((a=c)and(c=e)and(b=d))or((b=c)and(c=e)and(a=d))then begin
  write(g,'Full House');goto 1 end else
  if ((a=b)and(c=d))or((a=c)and(d=e))or((a=d)and(b=c))or((a=b)and(d=e))or
  ((a=b)and(c=e))or((a=c)and(b=d))or((a=c)and(b=e))or((a=d)and(b=e))or
  ((a=e)and(c=d))or((b=c)and(d=e))or((b=d)and(c=e))or((b=e)and(c=d))or
  ((a=d)and(c=e))or((a=e)and(b=c))or((a=e)and(b=d))then begin
  write(g,'Two Pairs');goto 1 end else
  if ((a=b)and(a=c))or((a=b)and(a=d))or
  ((a=b)and(a=e))or((b=d)and(b=c))or((b=d)and(b=e))
  or((c=d)and(c=e))or((a=c)and(c=e))or((b=c)and(c=e))or((a=d)and(d=e))
  or((a=b)and(b=d))then begin write(g,'Three of a Kind');goto 1 end else
  if (a=b)or(a=c)or(a=d)or(a=e)or(b=d)or(b=c)or(e=b)or(d=c)
  or(c=e)or(d=e) then write(g,'One Pair') else write(g,'Nothing');
  1:close(f);
  close(g)
end.

Краще в цій задачі використати масив. Спочатку відсортуємо його за зростанням, тоді легко перевіряти і рівність елементів, так як вони будуть сусідніми, і їх послідовність. Отже, програма буде мати вигляд:

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

label 1,2;
var
 f,g:text;i,j,k,n,l:byte;a:array[1..5]of byte;
begin
  assign(f,'input.txt');
  assign(g,'output.txt');
  reset(f);
  rewrite(g);
  for i:=1 to 5 do
  read(f,a[i]);
  for i:=1 to 4 do
  for j:=i+1 to 5 do
  if a[i]>a[j]then begin l:=a[i];a[i]:=a[j];a[j]:=l end;
  for i:=1 to 4 do
  if a[i+1]-a[i]=1 then k:=k+1;
  if k=4 then begin write(g,'Straight'); goto 1 end;
  k:=0; l:=a[1];
  for i:=2 to 5 do begin
  if a[i]<>l then goto 2;
  if a[i]=a[i-1] then begin n:=n+1;l:=a[i] end;
  2:if (a[i]=a[i-1])and(a[i]<>l) then k:=k+1 end;
  if n=4 then begin write(g,'Impossible'); goto 1 end;
  if (n=3)or(k=3) then begin write(g,'Four of a Kind'); goto 1 end;
  if ((n=1)and(k=2))or((n=2)and(k=1))then begin write(g,'Full House');goto 1 end;
  if (n=2)or(k=2) then begin write(g,'Three of a Kind'); goto 1 end;
  if (n=1)and(k=1)then begin write(g,'Two Pairs');goto 1 end;
  if (n=1)or(k=1)then begin write(g,'One Pair');goto 1 end
   else write(g,'Nothing');
  1:close(f);
  close(g)

end.


Задача B. Рада школи (100 балів)
Ім’я вхідного файлу: іnput.txt
Ім’я вхідного файлу: output.txt
Ліміт часу: 1 с.
До керівництва ради школи входять батьки, учні та вчителі, причому батьків повинно бути не менше 1/3 від загальної кількості членів ради. На поточний момент часу до ради школи входить N людей, з них K батьків. Визначте, скільки батьків потрібно додатково ввести в число ради школи, щоб їх кількість була не меншою 1/3 від загального числа всіх учасників.
 Вхідні дані
Вхідні дані містять два числа N і K (N › 0, 0 ≤ K ≤ N≤100000) записані через пропуск.
Вихідні дані
Вихідні дані містять одне число - мінімальна кількість батьків, яких потрібно долучити до числа ради школи.
Приклад
іnput.txt
output.txt
27 7
3

Ну, а ця задача досить проста, але потрібно врахувати випадки, коли К становить  більше ніж третю частину від N, щоб не отримати від'ємне число. Тоді програма буде мати вигляд:

program Project2;
{$APPTYPE CONSOLE}
uses
  SysUtils;
var
 f,g:text;n,k:int64;
begin
  assign(f,'input.txt');
  assign(g,'output.txt');
  reset(f);
  rewrite(g);
  read(f,n,k);
  if n=k then k:=0 else
  k:=n div 3 -k+1;
  write(g,k);
  close(f);
  close(g)

end.


Задача С. N-та цифра (100 балів)
Ім’я вхідного файлу: іnput.txt
Ім’я вхідного файлу: output.txt
Ліміт часу: 1с.
Дано початковий рядок 1, над яким застосовують наступну операцію: приписують праворуч такий же рядок, але з заміною нулів на одиниці, а одиниць на нулі. Цю операцію повторюють нескінченну кількість разів. Ваше завдання полягає в знаходженні N-тої цифри в отриманому рядку.
Вхідні дані
В першому рядку записано кількість тестів K. В наступних K рядках записано число N, номер цифри в K-му рядку (1≤K≤100, 1≤N≤1000000000).
Вихідні дані
В результаті вивести K рядків, в кожному з яких N-та цифра, відповідного рядка.
Приклади
іnput.txt
output.txt
1
7
1
2
1
2
1
0


Задача D. Порожній прямокутник (100 балів)
Ім’я вхідного файлу: іnput.txt
Ім’я вхідного файлу: output.txt
Ліміт часу: 2с.
            Задано N різних точок на площині (2≤N≤1000). Виберемо будь-які дві точок з даної множини з координатами (x1, y1) і (x2, y2). Для цієї пари точок можна побудувати прямокутник зі сторонами, паралельними осям координат, так що обрані точки будуть перебувати в протилежних кутах прямокутника. Прямокутник, побудований таким чином, назвемо порожнім, якщо всередині нього і на його границі немає інших заданих точок. Вам потрібно визначити, скільки різних порожніх прямокутників можна побудувати із заданого множини точок.
Вхідні дані
            Вхідні дані складаються з декількох рядків. Перший рядок файлу містить величину N(кількість точок). У кожному наступному рядкові через пропуск задаються координати X і Y однієї точки з множини цілих чисел, що не перевищують по модулю 1000000 (в 50% тестів координати не перевищують по модулю 10000).
Вихідні дані
Вихідні дані містять єдиний рядок зі знайденим числом порожніх прямокутників
Приклад
іnput.txt
output.txt
5
-1 4
1 4
1 1
2 1
-2 2
2


неділю, 12 лютого 2017 р.

ІІІ етап всеукраїнської олімпіади з інформатики 2016-17 н.р.


І-й тур.
А. Сміх
Степан любить багато сміятися. Сміх - це послідовність букв «a» і «h», які чергуються. Так наприклад, «ahahaha», «hah» і «a» є сміхом, а «abacaba» і «hh» - ні.
Степан розмовляє дуже швидко, тому всі його слова зливаються в одне велике. Для дослідження вам потрібно з'ясувати, як довго він може сміятися. У вас є рядок - запис розмови Степана. Визначте найбільшу довжину сміху в цій розмові.
Вхідні дані:
Перший рядок вхідного файлу містить одне натуральне число N (1 ≤ N ≤ 105) - довжина рядка з розмовою Степана. У другому рядку міститься рядок з маленьких латинських букв довжиною N - запис розмови Степана. 
Вихідні дані:
У вихідний файл виведіть одне число - найбільшу довжину сміху в розмові Степана.
Система оцінювання:
В даній задачі кожен тест оцінюється окремо.
Приклади вхідних та вихідних даних:
laugh.in
laugh.out
5
ahaha
5
24
ahahrunawayahahsofasthah
4
10
ahahaahaha
5

Розв'язок даної задачі в сурудовищі Delphi може бути таким:


program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var n,k,i,max:longint; f,g:text;r:array[1..100000]of char;
begin
assign(f,'laugh.in');
assign(g,'laugh.out');
rewrite(g);
reset(f);
read(f,n);
readln(f);
for i:=1 to n do
read(f,r[i]); i:=1;k:=0;
while i<=n do begin
if (k=0)and((r[i]='a')or(r[i]='h')) then begin k:=1;i:=i+1 end;
if ((r[i]='a')and(r[i-1]='h'))or((r[i]='h')and(r[i-1]='a'))then k:=k+1
else begin
if k>max then max:=k;k:=0 end;
i:=i+1 end;
write(g,max);
writeln(g);
close(f);
close(g);
end.

В. Операції з дробами
Дроби, як відомо, давня слабкість Степана. Ось і зараз він бере правильний нескоротний дріб a/b і виконує з ним наступні операції: до чисельника і знаменника дробу додає 1, а потім дріб скорочує до нескоротного.
Степана зацікавило питання, чи можна за допомогою таких операцій з дробу a/b отримати правильний дріб c/d?
Допоможіть Степану.
Вхідні дані:
Вхідний файл містить чотири числа a, b, c, d (0 < a < b ≤ 105, 0 < c < d ≤ 105), числа a і b взаємно прості, c і d взаємно прості, a/b ≠ c/d
Вихідні дані:
Виведіть одне натуральне число - скільки описаних операцій потрібно зробити, щоб з дробу a/b отримати правильний дріб c/d. Якщо цього зробити не можливо, то виведіть 0.
Система оцінювання:
В даній задачі кожен тест оцінюється окремо.
Приклади вхідних та вихідних даних:
fractions.in
fractions.out
1 3 2 3
2
2 3 1 3
0

Розв'язок даної задачі в сурудовищі Delphi може бути таким:


program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
label 1;
var a,b,c,d,k,x,y:longint; f,g:text;
begin
assign(f,'fraction.in');
assign(g,'fraction.out');
rewrite(g);
reset(f);
read(f,a,b,c,d);
k:=0;
repeat
k:=k+1;
a:=a+1;b:=b+1;
x:=a;y:=b;
while x<>y do
if y>x then y:=y-x else x:=x-y;
if x<>1 then begin a:=a div x;b:=b div y end;
if(a=c)and(b=d)then goto 1;
until k>1000;
k:=0;
1:write(g,k);
writeln(g);
close(f);
close(g);
end.


C. Максимальний добуток
Степан останнім часом приділяв мало уваги програмуванню і як, результат, не здав залік. Тепер йому потрібно терміново вирішити наступну задачу:
Дано масив цілих чисел A1, A2, ..., AN, абсолютна величина елементів якого не перевищує 2. Потрібно знайти такий непорожній підвідрізок Al, Al+1, ..., Ar цього масиву (1 ≤ l ≤ r ≤ N), що добуток чисел Al * Al+1 * ... * Ar є максимально можливим.
Звісно, Степан просить у вас допомоги у вирішенні даної задачі.
Вхідні дані:
В першому рядку вхідного файлу знаходиться число N (1 ≤ N ≤ 200 000) — кiлькiсть елементів масиву. В другому рядку знаходиться N цiлих чисел Ai (-2 ≤ Ai ≤ 2) - елементи масиву. 
Вихідні дані:
Єдиний рядок вихідного файлу має містити два числа l і r - знайдені границі оптимального відрізка (1 ≤ l ≤ r ≤ N). Якщо iснує декiлька вiдповiдей, виведiть будь-яку з них.
Система оцінювання:
В даній задачі кожен тест оцінюється окремо.
Приклади вхідних та вихідних даних:

maximum.in
maximum.out
5
1 -1 2 2 1
3 5
3
-1 0 -2
2 2
7
-1 -2 -1 -2 1 2 -2
2 7





D. Дивний сон 
Степану сниться дивний сон. У ньому Степан знаходиться на полі в клітиночку розміром N х M в клітинці з координатами (x, y).
Спочатку Степан дивиться уздовж додатного напрямку осі X. Потім він починає йти по полю з наступною закономірністю:
- Пройти на одну клітинку вперед. Повернути на 90◦ вправо.
- Пройти на одну клітинку вперед. Повернути на 90◦ вправо.
- Пройти на дві клітинки вперед. Повернути на 90◦ вправо.
- Пройти на дві клітинки вперед. Повернути на 90◦ вправо.
- Пройти на три клітинки вперед. Повернути на 90◦ вправо.
- Пройти на три клітини вперед. Повернути на 90◦ вправо.
- Пройти на чотири клітини вперед. Повернути на 90◦ вправо.
- І так далі...
Рух триває до тих пір, поки Степан не вийде за межі поля. Після цього він прокидається. Вранці Степан вирішив проаналізувати свій сон. Він здогадався, що в кожній клітинці він був максимум один раз, але ніяк не може згадати, скільки клітинок він відвідав. Степан просить вас написати програму, яка порахує кількість відвіданих ним клітинок.
Вхідні дані: У першому рядку вхідного файлу знаходяться два натуральних числа N, M (1 ≤ N, M ≤ 109) - розміри дошки уздовж осі X і осі Y відповідно. У другому рядку знаходяться два натуральних числа x, y (1 ≤ x ≤ N; 1 ≤ y ≤ M) - координати стартової позиції Степана. 
Вихідні дані:
У вихідний файл виведіть одне число - кількість клітинок, відвіданих Степаном уві сні.
Система оцінювання:
В даній задачі кожен тест оцінюється окремо.
Приклади вхідних та вихідних даних:

dream.in
dream.out
7 6
3 4
36
2 2
1 1
2
2 2
1 2
4


E. Вірус
Степан дуже ретельно слідкує за своїм здоров'ям. Кожного дня він читає книги з медицини і шукає інформацію про нові хвороби, тому вже давно знає, що різні хвороби можуть збуджуватись вірусами. Степану давно відомі деякі види вірусів і він перевірив, що жодного з них у нього немає. 
Але одного не найвдалішого для Степана дня він дізнався, що віруси можуть мутувати після того, як потрапили в організм людини. Мутація – це зміна ДНК таким чином, що в ньому змінюються рівно 2 символи, відстань між якими дорівнює k. ДНК віруса до потрапляння в організм людини представлено у вигляді рядка t, який складається з n маленьких літер латинського алфавіту. 
Дізнавшись таку страшну новину, Степан одразу кинувся перевіряти, чи не хворіє він мутованим вірусом. ДНК Степана також є рядком з маленьких літер латинського алфавіту. Допоможіть йому дізнатись, чи є в його ДНК підрядки довжиною n, які підходять під опис мутованого вірусу, наведеного вище.


Вхідні дані:
В першому рядку вхідного файлу дано представлення ДНК Степана s - рядок з маленьких літер латинського алфавіту. У другому рядку задано представлення ДНК віруса t - рядок з n маленьких літер латинського алфавіту. В третьому рядку задано число k (1 ≤ k ≤ n-1)
Вихідні дані:
У перший рядок вихідного файлу виведіть скільки разів мутивований вірус зустрічається в ДНК Степана. У другому рядку виведіть через пробіл в зростаючому порядку індекси початку входження мутивованого вірусу.
Система оцінювання:
В даній задачі три підзадачі. Бали за кожну підзадачу нараховуються тільки якщо усі тести підзадачі пройдені.
Підзадача 1 (30 балів):
ДНК Степана і віруса складаються не більш чим із 100 символів. 
Підзадача 2 (30 балів):
ДНК Степана і віруса складаються не більш чим із 10 000 символів.
Підзадача 3 (40 балів):
ДНК Степана і віруса складаються не більш чим із 200 000 символів.
Приклади вхідних та вихідних даних:


virus.in
virus.out
abaaaaa
baab
3
2
3 4
aaaaaaa
aaaa
3
0



ІІ-й тур

А. Останнє число

Степан вирішив сьогодні поекспериментувати з послідовністю натуральних чисел від 1 до N. Він спочатку викреслив усі непарні числа. Потім з тих, що залишились викреслив числа, які стоять на не парних місцях. Цю процедуру він повторював до тих пір, поки не залишилось тільки одно число.
Допоможіть Степану знати число яке залишилось.
Вхідні дані:
Єдиний рядок вхідного файлу містить одне число N (1 ≤ N ≤ 1018). 
Вихідні дані:
Виведіть одне натуральне число - відповідь на задачу.
Система оцінювання:
В даній задачі кожен тест оцінюється окремо.
Приклади вхідних та вихідних даних:
number.in
number.out
2
2







 

 

Степінь подібності
Степан називає степенем подібності двох рядків з великих латинських літер кількість сусідніх пар елементів першого рядка, які зустрічаються в другому рядку.
Наприклад, нехай у нас є два рядки ABBACAB і BCABB. Перший рядок має наступні пари: AB, BB, BA, AC, CA, AB. Відповідно, з указаних пар першого рядка в другому зустрічаються чотири пари AB, BB, CA, AB. 
Допоможіть Степану знайти степінь подібності двох заданих рядків.
Вхідні дані:
Вхідний файл містить два рядки з великих латинських літер, кожен рядок не порожній і його довжина не перевищує 105.
Вихідні дані:
Виведіть одне натуральне число - степінь подібності.
Система оцінювання:
В даній задачі кожен тест оцінюється окремо.
Приклади вхідних та вихідних даних:
degree.in
degree.out
ABBACAB
BCABB
4







C. Цукерки

Степан дуже любить цукерки. Сьогодні він йде на побачення і хоче пригостити дівчину цукерками. Степан виклав в ряд N цукерок. У кожної цукерки є тип pi. Степан планує вибрати послідовність цукерок, що йдуть підряд за однієї умови - в цій послідовності повинно бути рівно два різних типи цукерок. Степан просить вас дізнатися, яку максимальну кількість цукерок він може взяти, враховуючи умову.
Вхідні дані:
У першому рядку вхідного файлу знаходиться одне натуральне число N (1 ≤ N ≤ 106) - кількість цукерок.
У другому рядку знаходиться N цілих чисел pi (1 ≤ pi ≤ 109) - де рi - тип і-ї цукерки. 
Вихідні дані:
У першому рядку вихідного файлу виведіть ціле число - максимальну кількість цукерок, яку Степан зможе взяти на побачення.
Система оцінювання:
В даній задачі кожен тест оцінюється окремо.
Пояснення до прикладів:
У першому прикладі на столі лежить три типи цукерок 1, 2 і 3. Степан може взяти перші три цукерки з типами 3, 3, 1, а може взяти останні чотири цукерки 1, 2, 2, 1. Значить, максимальна кількість цукерок, яку він може взяти дорівнює чотирьом.
У другому прикладі існує всього один тип цукерок, значить Степан не зможе взяти жодної цукерки.
Приклади вхідних та вихідних даних:
candies.in
candies.out
6
3 3 1 1 2 2 1
4
2
1 1
0





D. Нове захоплення Степана

Нове захоплення Степана - малювання. Він вирішив купити К наборів олівців. Кожен набір складається з одного або декількох олівців. Кожен олівець має додатну довжину, яка виражається цілим числом міліметрів.
У магазині продаються N наборів олівців. Після того, як Степан купить рівно К наборів, він прийде додому і складе всі олівці в одну коробку. Степан дуже зрадіє, якщо різниця в довжині між найбільшим і найменшим олівцями в цій коробці буде мінімальна.
Тому він просить вас допомогти йому: виберіть з N наборів олівців рівно К так, щоб різниця між максимальним і мінімальним серед всіх куплених олівців була якомога менша.
Вхідні дані: У першому рядку вхідного файлу знаходяться два натуральних числа N, K (1 ≤ N ≤ 105, 1 ≤ K ≤ N) - кількість наборів олівців, наявних в магазині, і кількість наборів, необхідних Степану.
У кожному з наступних N рядків знаходиться Ci (1 ≤ Ci ≤ 2*105) - кількість олівців в наборі. Далі, в цьому ж рядку, слідують Ci натуральних чисел Aij (1 ≤ Aij ≤ 109) - довжини олівців в і-му наборі.
Гарантується, що сума всіх Ci не перевищує 2*105. 
Вихідні дані:
У єдиному рядку вихідного файлу виведіть найменшу різницю між максимальним і мінімальним купленими олівцями, яку можна досягти.
Система оцінювання:
В даній задачі три підзадачі. Бали за кожну підзадачу нараховуються тільки якщо усі тести підзадачі пройдені.
Підзадача 1 (31 бал): n ≤ 20, k > 1 
Підзадача 2 (31 бал): n ≤ 2000, p = 0
Підзадача 3 (38 балів): Без додаткових обмежень.
Приклади вхідних та вихідних даних:
pencil.in
pencil.out
3 2
3 1 3 4
3 5 1 2
1 4
3
5 3
3 2 1 3
2 4 1
3 4 2 4
4 3 2 3 3
2 5 6
3

E. Підводний човен

Підводний човен сів на мілину. Для його виявлення використовують дані супутника, який з високою точністю вимірює відхилення висоти поверхні води від середнього рівня моря. Знімок, отриманий із супутника, представляє собою масив з h рядків по w елементів у кожному рядку.
 
Введемо на знімку систему координат з віссю абсцис, яка напрямлена вздовж рядків знімку зліва направо, і віссю ординат, напрямленій вздовж стовпців знизу догори. Потенційне зображення підводного човна представляє собою множину елементів масиву, що складається з наступних частин: 
- "корпус" - полоса з елементів з координатами від (x1, y1) до (x2, y1), де x1 < x2;
- "рубка" - полоса з елементів з координатами від (x3, y1) до (x3, y2), де x1 ≤ x3 < x2, y1 ≤ y2;
- "хвіст" - полоса з елементів з координатами від (x4, y3) до (x4, y4), де x3 < x4 ≤ x2, y3 ≤ y1 ≤ y4.
Оскільки підводний човен знаходиться поблизу поверхні в районі з сильною течією, рівень води над ним трохи підвищується. Тому зображенням підводного човна на знімку будемо вважати зображення з максимально можливою сумою елементів масиву, що входять в нього.
Напишіть програму, яка знаходить на знімку зображення підводного човна і виводе суму його елементів. 
Вхідні дані:
Для стиснення даних, що передаються з супутника, кожен елемент знімка кодується маленькою буквою англійського алфавіту. Перший рядок вхідних даних містить число k (k ≤ 26) - кількість використаних для кодування букв. Другий рядок вхідних даних містить k цілих чисел Ci - значення відхилень, які відповідають кожному кодовому символу по порядку букв в англійському алфавіті від 1 до k-ї.
Третій рядок вхідних даних містить числа h i w - розміри знімка. Наступні h рядків містять по w символів - кодові значення елементів знімка. 
Вихідні дані:
У вихідний файл виведіть одне число - суму елементів масиву, що відповідають зображенню підводного човна.
Система оцінювання:
В даній задачі чотири підзадачі. Бали за кожну підзадачу нараховуються тільки якщо усі тести підзадачі пройдені.
Підзадача 1 (32 бала): 5 ≤ h, w ≤ 10, |Ci| ≤ 10 
Підзадача 2 (22 бала): 5 ≤ h, w ≤ 100, |Ci| ≤ 100 
Підзадача 3 (23 бала): 5 ≤ h, w ≤ 500, |Ci| ≤ 500 
Підзадача 3 (23 балів): 5 ≤ h, w ≤ 2000, |Ci| ≤ 2000 
Пояснення:
Для прикладу нижче наведено кілька потенційних зображень підводного човна.
 
Нижче наведено кілька множин елементів знімка, які не є потенційними зображеннями підводного човна:
 
Приклади вхідних та вихідних даних:
submarine.in
submarine.out
Пояснення
2
-10 1
6 11
aaaaaaaaaaa
aaabaaaaaaa
aaabaaaabaa
abbbbbbbbba
aaaaaaaabaa
aaaaaaaaaaa
13
...........
...b.......
...b....b..
.bbbbbbbbb.
........b..
...........
3
-4 -3 4
5 5
bbabc
ccaac
accba
baccb
baaaa
16
.....
.c...
.cc..
..c..
.....

3
-2 4 0
5 5
abccb
cccac
cbcba
cccbb
accba
24
.b...
.c...
.b.b.
cccbb
...b.
4
-1 -5 -3 0
5 5
bbabc
ccaac
acdba
baccb
baaaa
-2
.....
..aa.
.....
.....
.....