[คำถามนี้เป็นการติดตามการคำนวณการวิ่งของสตริง ]
ช่วงเวลา
p
ของสตริงw
คือจำนวนเต็มบวกใด ๆp
เช่นว่าw[i]=w[i+p]
เมื่อใดก็ตามที่ทั้งสองด้านของสมการนี้ถูกกำหนด อนุญาตแสดงขนาดของระยะเวลาที่เล็กที่สุดของper(w)
w
เราบอกว่าสตริงw
เป็นper(w) <= |w|/2
IFF
ดังนั้นอย่างไม่เป็นทางการสตริงธาตุเป็นเพียงสตริงที่ทำขึ้นจากสตริงอื่นทำซ้ำอย่างน้อยหนึ่งครั้ง ภาวะแทรกซ้อนเพียงอย่างเดียวคือในตอนท้ายของสตริงเราไม่ต้องการสำเนาเต็มของสตริงซ้ำตราบใดที่มันถูกทำซ้ำอย่างครบถ้วนอย่างน้อยหนึ่งครั้ง
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] = atat
T[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] = aabaabaa
T[9,15] = aacaaca
สตริง
T = atatbatatb
มีการรันสามรายการต่อไปนี้ พวกเขาคือT[1, 4] = atat
, และT[6, 9] = atat
T[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
และมันไม่เคยเอาชนะตัวอักษรไบนารี แบบคาดเดายากฉันคาดหวังว่าไบนารีสตริงควรเหมาะสมที่สุดเนื่องจากการเพิ่มอักขระเพิ่มความยาวขั้นต่ำของการรัน