[Câu hỏi này là phần tiếp theo để tính toán các chuỗi chạy ]
Một chu kỳ
p
của một chuỗiw
là bất kỳ số nguyên dương nàop
sao chow[i]=w[i+p]
bất cứ khi nào cả hai mặt của phương trình này được xác định. Hãyper(w)
biểu thị kích thước của khoảng thời gian nhỏ nhấtw
. Chúng tôi nói rằng một chuỗiw
là iff định kỳper(w) <= |w|/2
.
Vì vậy, không chính thức một chuỗi định kỳ chỉ là một chuỗi được tạo thành từ một chuỗi khác được lặp lại ít nhất một lần. Điều phức tạp duy nhất là ở cuối chuỗi chúng ta không yêu cầu một bản sao đầy đủ của chuỗi lặp lại miễn là nó được lặp lại toàn bộ ít nhất một lần.
Ví dụ, hãy xem xét chuỗi x = abcab
. per(abcab) = 3
như x[1] = x[1+3] = a
, x[2]=x[2+3] = b
và không có thời kỳ nhỏ hơn. Chuỗi abcab
do đó không phải là định kỳ. Tuy nhiên, chuỗi ababa
là định kỳ như per(ababa) = 2
.
Như nhiều ví dụ abcabca
, ababababa
và abcabcabc
cũng là định kỳ.
Đối với những người thích regexes, chuỗi này phát hiện xem một chuỗi có định kỳ hay không:
\b(\w*)(\w+\1)\2+\b
Nhiệm vụ là tìm tất cả các chuỗi định kỳ tối đa trong một chuỗi dài hơn. Chúng đôi khi được gọi là chạy trong văn học.
Một chuỗi con
w
là một chuỗi con định kỳ tối đa (chạy) nếu nó là định kỳ vàw[i-1] = w[i-1+p]
cũng khôngw[j+1] = w[j+1-p]
. Một cách không chính thức, "chạy" không thể được chứa trong một "lần chạy" lớn hơn với cùng thời gian.
Vì hai lần chạy có thể biểu thị cùng một chuỗi ký tự xuất hiện ở các vị trí khác nhau trong chuỗi tổng thể, nên chúng tôi sẽ biểu diễn các lần chạy theo các khoảng. Dưới đây là định nghĩa trên lặp đi lặp lại về các khoảng.
Một chuỗi chạy (hoặc chuỗi con định kỳ tối đa) trong một chuỗi
T
là một khoảng[i...j]
vớij>=i
, sao cho
T[i...j]
là một từ định kỳ với thời kỳp = per(T[i...j])
- Nó là tối đa. Chính thức, cũng không
T[i-1] = T[i-1+p]
phảiT[j+1] = T[j+1-p]
. Một cách không chính thức, việc chạy không thể được bao gồm trong một lần chạy lớn hơn với cùng thời gian.
Biểu thị bằng RUNS(T)
tập chạy trong chuỗi T
.
Ví dụ về các hoạt động
Bốn chuỗi con kỳ tối đa (chạy) trong chuỗi
T = atattatt
làT[4,5] = tt
,T[7,8] = tt
,T[1,4] = atat
,T[2,8] = tattatt
.Chuỗi
T = aabaabaaaacaacac
chứa 7 chuỗi con kỳ tối đa sau (chạy):T[1,2] = aa
,T[4,5] = aa
,T[7,10] = aaaa
,T[12,13] = aa
,T[13,16] = acac
,T[1,8] = aabaabaa
,T[9,15] = aacaaca
.Chuỗi
T = atatbatatb
chứa ba lần chạy sau. Đó là:T[1, 4] = atat
,T[6, 9] = atat
vàT[1, 10] = atatbatatb
.
Ở đây tôi đang sử dụng 1-indexing.
Nhiệm vụ
Viết mã sao cho mỗi số nguyên n bắt đầu từ 2, bạn xuất ra số lần chạy lớn nhất có trong bất kỳ chuỗi nhị phân có độ dài nào n
.
Ghi bàn
Điểm của bạn là cao nhất n
bạn đạt được trong 120 giây sao cho tất cả k <= n
, không ai khác đã đăng câu trả lời đúng cao hơn bạn. Rõ ràng nếu bạn có tất cả các câu trả lời tối ưu thì bạn sẽ nhận được điểm cho bài cao nhất n
bạn đăng. Tuy nhiên, ngay cả khi câu trả lời của bạn không phải là tối ưu, bạn vẫn có thể đạt được điểm nếu không ai khác có thể đánh bại nó.
Ngôn ngữ và thư viện
Bạn có thể sử dụng bất kỳ ngôn ngữ và thư viện có sẵn mà bạn thích. Nếu khả thi, sẽ tốt khi có thể chạy mã của bạn, vì vậy vui lòng bao gồm một lời giải thích đầy đủ về cách chạy / biên dịch mã của bạn trong Linux nếu có thể.
Ví dụ tối ưu
Trong các mục sau : n, optimum number of runs, example string
.
2 1 00
3 1 000
4 2 0011
5 2 00011
6 3 001001
7 4 0010011
8 5 00110011
9 5 000110011
10 6 0010011001
11 7 00100110011
12 8 001001100100
13 8 0001001100100
14 10 00100110010011
15 10 000100110010011
16 11 0010011001001100
17 12 00100101101001011
18 13 001001100100110011
19 14 0010011001001100100
20 15 00101001011010010100
21 15 000101001011010010100
22 16 0010010100101101001011
Chính xác những gì mã đầu ra của tôi nên?
Đối với mỗi n
mã của bạn sẽ xuất ra một chuỗi và số lần chạy mà nó chứa.
Máy của tôi Thời gian sẽ được chạy trên máy của tôi. Đây là bản cài đặt Ubuntu tiêu chuẩn trên Bộ xử lý tám lõi AMD FX-8350. Điều này cũng có nghĩa là tôi cần để có thể chạy mã của bạn.
Câu trả lời hàng đầu
- 49 bởi Anders Kaseorg trong C . Đơn luồng và chạy với L = 12 (2GB RAM).
- 27 bởi cdlane trong C .
{0,1}
-strings, xin vui lòng nói rõ điều đó. Mặt khác, bảng chữ cái có thể là vô hạn và tôi không hiểu tại sao các mẫu thử của bạn phải tối ưu, vì dường như bạn cũng chỉ tìm kiếm các {0,1}
chuỗi.
n
đến 12
và nó không bao giờ đánh bại bảng chữ cái nhị phân. Về mặt heurist, tôi hy vọng rằng một chuỗi nhị phân sẽ là tối ưu, bởi vì việc thêm nhiều ký tự sẽ làm tăng độ dài tối thiểu của một lần chạy.