Фон
Розглянемо (замкнутий) ланцюжок стрижнів, кожен з яких має цілу довжину. Скільки чітко виражених без дірок поліоміно ви можете сформувати в заданому ланцюжку? Або іншими словами, скільки різних непересічних багатокутників з вирівняними сторонами осі можна скласти за допомогою заданого ланцюга?
Давайте розглянемо приклад. Розглянемо конкретну ланцюжок, що складається з 8 стрижнів довжиною 1 і 2, які ми можемо представити як [1, 1, 2, 2, 1, 1, 2, 2]
. До ротацій та перекладів є лише 8 можливих поліоміно (ми підраховуємо різні відбиття):
Цей перший стержень темно-синього кольору, а потім ми проходимо багатокутник у напрямку проти годинникової стрілки .
Почуття обертання не впливає на результат у наведеному вище прикладі. Але давайте розглянемо інший ланцюг [3, 1, 1, 1, 2, 1, 1]
, який дає наступні 3 поліоміно:
Зауважте, що ми не включаємо відображення останнього полиомино, оскільки це вимагало б обходу за годинниковою стрілкою.
Якби у нас був більш гнучкий ланцюжок однакової довжини, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
ми б насправді мали змогу сформувати обидва відбиття серед деяких інших поліоніно, що налічували 9:
Змагання
Давши опис ланцюга, як масиву чи подібного, визначте кількість різних поліміноїв, які ви можете сформувати (аж до обертання та перекладу), використовуючи стрижні в порядку , обходячись по периметру в напрямку проти годинникової стрілки.
Будь ласка, напишіть повну програму та включіть команди для компіляції (якщо це можливо) та запустіть свій код із командного рядка. Також додайте посилання на безкоштовний компілятор / перекладач для вашої мови.
Ваша програма повинна прочитати вхід із STDIN. Перший рядок буде містити ціле число M . Наступні M рядки - це тестові випадки, кожен з яких буде розділеним пробілом списком довжин стрижнів. Ваша програма повинна надрукувати M рядків до STDOUT, кожен з яких складається з одного цілого числа - кількості різних поліміноїв, які можна сформувати.
Потрібно використовувати лише одну нитку.
Ваша програма не повинна використовувати більше 1 ГБ пам'яті. (Це не зовсім суворий ліміт, але я буду стежити за використанням пам'яті вашого виконуваного файлу і вбиватиму будь-який процес, який постійно використовує більше 1 Гб або значно шипшає над ним.)
Щоб запобігти надмірній кількості попередніх обчислень, ваш код не повинен перевищувати 20 000 байт, і ви не повинні читати жодні файли.
Ви також не повинні оптимізувати обрані конкретні тестові випадки (наприклад, шляхом жорсткого кодування їх результатів). Якщо я підозрюю, що ви це робите, я залишаю за собою право створювати нові набори орієнтирів. Набори тестів є випадковими, тому продуктивність вашої програми повинна бути репрезентативною для її продуктивності при довільному введенні. Єдине припущення, яке вам дозволяється зробити, - це те, що сума довжин стрижня є парною.
Оцінка балів
Я забезпечив набори орієнтирів для ланцюгів N = 10, 11, ..., 20 стрижнів. Кожен тестовий набір містить 50 випадкових ланцюгів довжиною від 1 до 4 включно.
Ваш основний бал - найбільший N, за який ваша програма завершить весь тестовий набір протягом 5 хвилин (на моїй машині, під Windows 8). Вимикач краватки - це фактичний час, який зайняла ваша програма на цьому тестовому наборі.
Якщо хтось обіграє найбільший тестовий набір, я продовжую додавати більші.
Випробування
Ви можете використовувати наступні тестові випадки, щоб перевірити правильність вашої реалізації.
Input Output
1 1 0
1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1 1 1 9
1 1 1 1 1 1 1 1 1 1 1 1 36
1 1 1 1 1 1 1 1 1 1 1 1 1 1 157
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 758
1 1 2 2 1 1 2 2 8
1 1 2 2 1 1 2 2 1 1 23
1 1 2 2 1 1 2 2 1 1 2 2 69
1 2 1 2 1 2 1 2 3
1 2 1 2 1 2 1 2 1 2 1 2 37
1 2 3 2 1 2 3 2 5
1 2 3 2 1 2 3 2 1 2 3 2 23
3 1 1 1 2 1 1 3
1 2 3 4 5 6 7 1
1 2 3 4 5 6 7 8 3
1 2 3 4 5 6 7 8 9 10 11 5
2 1 5 3 3 2 3 3 4
4 1 6 5 6 3 1 4 2
3 5 3 5 1 4 1 1 3 5
1 4 3 2 2 5 5 4 6 4
4 1 3 2 1 2 3 3 1 4 18
1 1 1 1 1 2 3 3 2 1 24
3 1 4 1 2 2 1 1 2 4 1 2 107
2 4 2 4 2 2 3 4 2 4 2 3 114
Ви знайдете вхідний файл з цим тут .
Таблиця лідерів
User Language Max N Time taken (MM:SS:mmm)
1. feersum C++ 11 19 3:07:430
2. Sp3000 Python 3 18 2:30:181