[Bu soru bir dizgenin işlemlerini hesaplamak için yapılan bir takiptir ]
Bir dönem
p
bir dizew
herhangi bir pozitif tam sayı olduğup
şekildew[i]=w[i+p]
bu denklemin her iki tarafın da tanımlandığı zaman. Letper(w)
en küçük döneminin boyutunu göstermektedirlerw
. Bir dizew
periyodik iff olduğunu söylüyoruzper(w) <= |w|/2
.
Dolayısıyla, gayrı resmi olarak bir periyodik dize, sadece en az bir kez tekrarlanan başka bir dizgeden yapılan bir dizedir. Tek karışıklık, dizenin sonunda, en az bir kez bütünüyle tekrar edildiği sürece, tekrarlanan dizinin tam bir kopyasını gerektirmememizdir.
Örneğin, dizeyi düşünün x = abcab
. per(abcab) = 3
olarak x[1] = x[1+3] = a
, x[2]=x[2+3] = b
ve hiçbir küçük süresi vardır. Bu abcab
nedenle dize periyodik değildir. Ancak, dize ababa
olarak periyodiktir per(ababa) = 2
.
Daha fazla örnek olarak abcabca
, ababababa
ve abcabcabc
ayrıca periyodiktir.
Regexes sevenler için, bu bir dize periyodik olup olmadığını algılar:
\b(\w*)(\w+\1)\2+\b
Görev, tüm maksimum periyodik alt dizileri daha uzun bir dizgede bulmaktır . Bunlara bazen literatürde koşu denir .
Bir alt
w
dize periyodik ve new[i-1] = w[i-1+p]
de ne ise, maksimum periyodik alt dizedir (çalıştırma)w[j+1] = w[j+1-p]
. Gayriresmi olarak, "run" aynı süre içinde daha büyük bir "run" içeremez.
İki satır, genel dizedeki farklı yerlerde bulunan aynı karakter dizisini temsil edebildiğinden, aralıklarla çalıştırmaları temsil edeceğiz. İşte aralıklarla tekrarlanan yukarıdaki tanım.
String içinde bir çalıştırma (maksimal periyodik substring)
T
bir aralık[i...j]
ilej>=i
, öyle ki
T[i...j]
periyodik bir periyodik kelimedirp = per(T[i...j])
- Bu maksimum. Resmen, ne
T[i-1] = T[i-1+p]
deT[j+1] = T[j+1-p]
. Gayrı resmi olarak, koşu aynı dönemdeki daha büyük bir koşuda dahil edilemez.
Dizede RUNS(T)
çalıştırma kümesini gösterir T
.
Koşu örnekleri
Dizede dört maksimal periyodik altdizgelerin (ishal)
T = atattatt
vardırT[4,5] = tt
,T[7,8] = tt
,T[1,4] = atat
,T[2,8] = tattatt
.Dize
T = aabaabaaaacaacac
aşağıdaki 7 maksimal periyodik alt dizeleri (ishal) içerir: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
.Dize
T = atatbatatb
aşağıdaki üç koşuyu içerir. Bunlar:T[1, 4] = atat
,T[6, 9] = atat
veT[1, 10] = atatbatatb
.
Burada 1 indeksleme kullanıyorum.
Görev
2'den başlayarak her bir tamsayı için, herhangi bir uzunluktaki ikilik dizgide bulunan en büyük sayıdaki çalışmayı çıkarmanız için kod yazınız n
.
Gol
Skorunuz n
120 saniyede ulaştığınız en yüksek puandır, öyle ki herkes için k <= n
sizden daha yüksek bir cevap vermediniz. Açıkça bütün optimum cevaplara sahipseniz, gönderdiğiniz en yüksek notu alırsınız n
. Bununla birlikte, cevabınız optimum olmasa bile, başka kimse onu geçemezse puanı alabilirsiniz.
Diller ve kütüphaneler
İstediğiniz dili ve kütüphaneyi istediğiniz gibi kullanabilirsiniz. Mümkünse, kodunuzu çalıştırmanız iyi olur, bu yüzden lütfen mümkünse Linux'ta kodunuzu nasıl çalıştıracağınıza / derleyeceğinize dair tam bir açıklama ekleyin.
Örnek optima
Aşağıda: 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
Kodum tam olarak ne yazmalı?
Her biri n
için kodunuz tek bir dize ve içerdiği çalışma sayısını göstermelidir.
Benim Makine zamanlamaları benim makinede işletilecek. Bu, AMD FX-8350 Sekiz Çekirdekli İşlemciye standart bir ubuntu kurulumudur. Bu ayrıca kodunuzu çalıştırabilmem gerektiği anlamına geliyor.
Ana cevaplar
- 49 Anders Kaseorg göre C . Tek dişli ve L = 12 (2GB RAM) ile çalıştırın.
- 27 ° C'de C cdlane .
{0,1}
dizeleri düşünmemizi istiyorsanız , lütfen açıkça belirtin. Aksi halde, alfabe sonsuz olabilir ve test kasetlerinin neden optimal olması gerektiğini anlamıyorum, çünkü siz de sadece {0,1}
dizgileri araştırdınız .
n
için yukarı 12
ve ikili alfabe hiç yenemedi. Sezgisel olarak bir ikili dizgenin optimal olmasını beklerdim, çünkü daha fazla karakter eklemek bir koşunun minimum uzunluğunu arttırır.