[คำถามนี้เป็นการติดตามการคำนวณการวิ่งของสตริง ]
ช่วงเวลา
pของสตริงwคือจำนวนเต็มบวกใด ๆpเช่นว่าw[i]=w[i+p]เมื่อใดก็ตามที่ทั้งสองด้านของสมการนี้ถูกกำหนด อนุญาตแสดงขนาดของระยะเวลาที่เล็กที่สุดของper(w)wเราบอกว่าสตริงwเป็นper(w) <= |w|/2IFF
ดังนั้นอย่างไม่เป็นทางการสตริงธาตุเป็นเพียงสตริงที่ทำขึ้นจากสตริงอื่นทำซ้ำอย่างน้อยหนึ่งครั้ง ภาวะแทรกซ้อนเพียงอย่างเดียวคือในตอนท้ายของสตริงเราไม่ต้องการสำเนาเต็มของสตริงซ้ำตราบใดที่มันถูกทำซ้ำอย่างครบถ้วนอย่างน้อยหนึ่งครั้ง
x = abcabสำหรับตัวอย่างพิจารณาสตริง per(abcab) = 3เป็นx[1] = x[1+3] = a, x[2]=x[2+3] = bและไม่มีระยะเวลาที่มีขนาดเล็ก สตริงabcabจึงไม่เป็นระยะ อย่างไรก็ตามสตริงababaเป็นระยะ ๆ per(ababa) = 2เป็น
ในฐานะที่เป็นตัวอย่างเพิ่มเติมabcabca, ababababaและabcabcabcนอกจากนี้ยังมีเป็นระยะ ๆ
สำหรับผู้ที่ชอบ regexes คนนี้ตรวจพบว่าสตริงเป็นระยะหรือไม่:
\b(\w*)(\w+\1)\2+\b
ภารกิจคือค้นหาสตริงย่อยตามระยะเวลาสูงสุดทั้งหมดในสตริงที่ยาวกว่า บางครั้งเรียกว่าการวิ่งในวรรณกรรม
สตริงย่อย
wเป็นระยะย่อยสูงสุด (วิ่ง) ถ้ามันเป็นระยะเวลาและค่ามิได้w[i-1] = w[i-1+p]w[j+1] = w[j+1-p]อย่างไม่เป็นทางการ "รัน" ไม่สามารถอยู่ใน "รัน" ที่ใหญ่กว่าด้วยช่วงเวลาเดียวกัน
เนื่องจากการวิ่งสองครั้งสามารถแสดงสายอักขระเดียวกันที่เกิดขึ้นในสถานที่ที่แตกต่างกันในสายอักขระโดยรวมเราจะแสดงการวิ่งตามช่วงเวลา นี่คือคำจำกัดความข้างต้นซ้ำในแง่ของช่วงเวลา
สตริงย่อยการเรียกใช้ (หรือสตริงย่อยสูงสุด) ในสตริง
Tคือช่วงเวลา[i...j]ด้วยj>=iเช่นนั้น
T[i...j]เป็นคำที่มีคาบตามระยะเวลาp = per(T[i...j])- มันเป็นสูงสุด อย่างเป็นทางการค่ามิได้
T[i-1] = T[i-1+p]T[j+1] = T[j+1-p]อย่างไม่เป็นทางการไม่สามารถอยู่ในการรันที่ใหญ่ขึ้นในช่วงเวลาเดียวกัน
แสดงว่าโดยชุดของการทำงานในสตริงRUNS(T)T
ตัวอย่างการวิ่ง
สี่สตริงระยะสูงสุด (วิ่ง) ในสตริง
T = atattattมีT[4,5] = tt,T[7,8] = tt, ,T[1,4] = atatT[2,8] = tattattสตริง
T = aabaabaaaacaacacมีดังต่อไปนี้ 7 สตริงระยะสูงสุด (วิ่ง):T[1,2] = aa,T[4,5] = aa,T[7,10] = aaaa,T[12,13] = aa,T[13,16] = acac, ,T[1,8] = aabaabaaT[9,15] = aacaacaสตริง
T = atatbatatbมีการรันสามรายการต่อไปนี้ พวกเขาคือT[1, 4] = atat, และT[6, 9] = atatT[1, 10] = atatbatatb
ที่นี่ฉันใช้การจัดทำดัชนี 1 ครั้ง
งาน
เขียนโค้ดเพื่อให้สำหรับแต่ละจำนวนเต็ม n เริ่มต้นที่ 2 คุณส่งออกตัวเลขที่ใหญ่ที่สุดของการทำงานที่อยู่ในสตริงไบนารีใด ๆ nของความยาว
คะแนน
คะแนนของคุณนั้นสูงที่สุดที่nคุณไปถึงใน 120 วินาทีซึ่งสำหรับทุกคนk <= nไม่มีใครโพสต์คำตอบที่ถูกต้องสูงกว่าคุณ เห็นได้ชัดว่าถ้าคุณมีคำตอบที่ดีที่สุดแล้วคุณจะได้รับคะแนนสูงสุดสำหรับการnโพสต์ อย่างไรก็ตามแม้ว่าคำตอบของคุณจะไม่เหมาะสมคุณก็ยังสามารถได้คะแนนถ้าไม่มีใครสามารถเอาชนะได้
ภาษาและห้องสมุด
คุณสามารถใช้ภาษาและไลบรารี่ที่คุณต้องการได้ หากเป็นไปได้จะเป็นการดีที่จะสามารถเรียกใช้รหัสของคุณได้ดังนั้นโปรดระบุคำอธิบายโดยละเอียดเกี่ยวกับวิธีเรียกใช้ / รวบรวมรหัสของคุณใน Linux หากเป็นไปได้
ตัวอย่าง optima
ในสิ่งต่อไปนี้: 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
รหัสของฉันควรออกอะไร
สำหรับแต่ละnรหัสของคุณควรส่งออกสายเดียวและจำนวนของการทำงานมันมี
My Machineเวลาของฉันจะทำงานบนเครื่องของฉัน นี่คือการติดตั้ง Ubuntu มาตรฐานบนโปรเซสเซอร์ AMD FX-8350 Eight-Core นี่ก็หมายความว่าฉันต้องสามารถเรียกใช้รหัสของคุณได้
คำตอบชั้นนำ
- 49โดย Anders Kaseorg ในC เธรดเดี่ยวและเรียกใช้ด้วย L = 12 (RAM 2GB)
- 27โดย cdlane ในC
{0,1}สตริงเท่านั้นโปรดระบุอย่างชัดเจนว่า มิฉะนั้นตัวอักษรอาจไม่มีที่สิ้นสุดและฉันไม่เห็นว่าทำไมการทดสอบของคุณควรดีที่สุดเพราะดูเหมือนว่าคุณจะค้นหาเฉพาะ{0,1}สตริงด้วย
nไปด้วย12และมันไม่เคยเอาชนะตัวอักษรไบนารี แบบคาดเดายากฉันคาดหวังว่าไบนารีสตริงควรเหมาะสมที่สุดเนื่องจากการเพิ่มอักขระเพิ่มความยาวขั้นต่ำของการรัน
