рдЕрд╣реЛ-рдХреЛрд░рд╕рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рдердо

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рдЬрдЯрд┐рд▓ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдХрдареЛрд░ рдЧрдгрд┐рддреАрдп рдкреНрд░рдорд╛рдгреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЖрдо рддреМрд░ рдкрд░ рд╕рд╣рдЬ рд╣реИрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░рд╕реНрдкрд░ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рд╡рд░рдг


рдЕрд╣реЛ-рдХреЛрд░рд╕рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдПрдХ рджрд┐рдП рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╕рднреА рдирдореВрдирд╛ рддрд╛рд░ рдХреЗ рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рднрд╛рд╡реА рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ 1975 рдореЗрдВ рдЕрд▓реНрдлреНрд░реЗрдб рдЕрд╣реЛ рдФрд░ рдорд╛рд░реНрдЧрд░реЗрдЯ рдХреЛрд░рд╛рд╕рд┐рдХ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдЗрдирдкреБрдЯ рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдкреИрдЯрд░реНрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ [i] рдФрд░ рд▓рд╛рдЗрди sред рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдкреИрдЯрд░реНрди рдХреА рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рд╣реИ [i] рдПрд╕ рдореЗрдВ рддрд╛рд░ред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╕рд╛рд░ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ - рдмреЛрд░рди рдФрд░ рдЙрд╕ рдкрд░ рдПрдХ рдкрд░рд┐рдорд┐рдд рдирд┐рд░реНрдзрд╛рд░рдХ рдСрдЯреЛрдореЗрдЯрди рдХрд╛ рдирд┐рд░реНрдорд╛рдгред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЦреЛрдЬрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рджреНрд╡рд┐рдШрд╛рдд рд╕рдордп рдореЗрдВ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдХреБрд╢рд▓ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрд╣реЛ-рдХреЛрд░рд╕рд┐рдХ рдХреЗ рд╕рднреА рднрд╛рдЧ рдЕрд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд░реЗрдЦрд╛ рд╕реЗ рдЕрдзрд┐рдХ рди рд╣реЛрдВред рд╣рдо рдЕрдВрдд рдореЗрдВ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдкрд░ рд▓реМрдЯреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдШрдЯрдХреЛрдВ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВрдЧреЗред

рдирдореВрдирд╛ рддрд╛рд░ рдХреЗ рдПрдХ рд╕реЗрдЯ рдкрд░ рдмреЛрд░рд╛рди рдирд┐рд░реНрдорд╛рдг


рдмреЛрд░рд╛рди рдХреА рд╕рдВрд░рдЪрдирд╛


рдмреЛрд░реЙрди рдХреНрдпрд╛ рд╣реИ? рд╕рдЦреНрддреА рд╕реЗ рдмреЛрд▓рдирд╛, рдмреЛрд░рд╛рди рдПрдХ рдкреЗрдбрд╝ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ (рдореВрд▓ рдПрдХ рд╢реВрдиреНрдп рдкрдВрдХреНрддрд┐ - otes) рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред 1 рдЕрдХреНрд╖рд░ рдХреЛрдиреЗ рдХреЗ рдмреАрдЪ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╣ рдкреНрд░рддреНрдпрдп рдХреЗ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдореВрд▓рднреВрдд рдЕрдВрддрд░ рд╣реИ, рдЖрджрд┐), рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдбрд╝ рдХреЗ рд╕рд╛рде рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рдХреБрдЫ рд╢реАрд░реНрд╖ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдФрд░ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреНрд░рдо рдореЗрдВ рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рд╕рдВрд╡рд╛рд░рдирд╛, рд╣рдореЗрдВ рдЗрд╕ рд╢реАрд░реНрд╖ рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рд░реЗрдЦрд╛ рдорд┐рд▓рддреА рд╣реИ ред рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдмреЛрд░реЙрди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ, рд░реВрдЯ рдФрд░ рдХрд┐рд╕реА рднреА рд╢реАрд░реНрд╖ рдХреЗ рдмреАрдЪ рдХреЗ рдкрде рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рднреА рдЕрдиреБрд╕рд░рдг рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП - рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ (рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рд╡рд░реНрдЯреЗрдХреНрд╕ рдФрд░ рдЙрд╕ рд░реЗрдЦрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЗрд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ)ред
рд╣рдо рд╕реНрд░реЛрдд рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдмреЛрд░реЙрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 1 рд╢реАрд░реНрд╖ рд╣реИ, рдореВрд▓ (рд░реВрдЯ) рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдирд╛ рдЗрд╕ рддрд░рд╣ рд╣реЛрддрд╛ рд╣реИ: рдЬрдбрд╝ рдореЗрдВ рд╢реБрд░реВ, рд╣рдо рдЕрдкрдиреЗ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдЪрд▓рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдЧрд▓реЗ рдЕрдХреНрд╖рд░ рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рдХрд┐рдирд╛рд░реЗ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рдХрд┐рдирд╛рд░рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╢реАрд░реНрд╖ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рддрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрдорд┐рдд рдмреЛрд░реЙрди рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: 1) рдЕрдХрдм, 2) рдПрд╕реАрд╕реА, 3) рдПрд╕реАрдПрд╕реА, 4) рдмрд╛рдХрд╛, 5) рдПрдмреАрдмреА, 6) рдЬреЗрдб, 7) рдПрд╕реАред

рдЫрд╡рд┐
(рдЪрд┐рддреНрд░ рез)

рдкрдВрдХреНрддрд┐ 7 рдХреЗ рдЬреЛрдбрд╝ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣ рдирдП рд╕рд┐рд░реЗ рдФрд░ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдВрддрд░рд┐рдХ рд╢реАрд░реНрд╖ рдкрд░ рд░реБрдХрддреА рд╣реИред рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдПрдХ рд░реЗрдЦрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ (рд▓рд╛рд▓ рд╡реГрддреНрдд)ред

рдЫрд╡рд┐
(рдЪрд┐рддреНрд░ 2)

рд╣рдо рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдмреЛрд░ рдореЗрдВ рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрд┐рдирд╛рд░реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдмрд╢рд░реНрддреЗ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрд╕рд░реНрдЧ рд╣реЛред рдПрдХ рдЪрд░рдо рдорд╛рдорд▓рд╛ - рдЬреЛрдбрд╝реЗ рдореЗрдВ рдирдореВрдиреЛрдВ рдХреА рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднрд╛рдЧ рдирд╣реАрдВ рд╣реИред рддреЛ рдмреЛрд░ рдореЗрдВ рдХреЛрдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдКрдкрд░реА рд╕реАрдорд╛ рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ + 1 (рд░реВрдЯ) рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛ рдпреЛрдЧ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╣рдо рдмреЛрд░реЙрди рдХреЛ рд╡рд░реНрдЯрд┐рдХрд▓ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреА рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд░реВрдЯ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди (рдореВрд▓ = 0) рд╣реЛрддрд╛ рд╣реИред рд╢реАрд░реНрд╖ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рд╡рд░рдг:

//k -   struct bohr_vrtx{ int next_vrtx[k],pat_num; bool flag; }; 


next_vrtx [i] рд╡рд╣ рд╢реАрд░реНрд╖ рд░реЗрдЦрд╛ рд╣реИ, рдЬрд┐рд╕ рд╡рд░реНрдг рд╕реЗ рд╣рдо рд╡рд░реНрдгрдорд╛рд▓рд╛ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ i рдХреЗ рд╕рд╛рде рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рдзреНрд╡рдЬ рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░рд╛ рд╢реАрд░реНрд╖ рд╕реНрд░реЛрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, pat_num рдЗрд╕ рд╢реАрд░реНрд╖ рджреНрд╡рд╛рд░рд╛ рдирд╛рдорд┐рдд рдирдореВрдиреЗ рдХрд╛ рдирдВрдмрд░ рд╣реИред
рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЗрдиреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдкреВрд░реНрд╡-рдЧрдгрдирд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рд▓рд╛рдЧрдд рд╣реИред рд╣рдо рдПрд╕рдЯреАрдПрд▓ - рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдореЗрдВ, рд╕реНрдореГрддрд┐ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрдд рд╢реВрдиреНрдп рд╣реЛрдЧреАред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ (рд╣рдо рдПрдХ 26-рдЕрдХреНрд╖рд░ рдХреЗ рдирд┐рдЪрд▓реЗ рдЕрдХреНрд╖рд░ рд▓реИрдЯрд┐рди рд╡рд░реНрдгрдорд╛рд▓рд╛ => k = 26) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдирдпрд╛ рд╢реАрд░реНрд╖ рдмрдирд╛рдиреЗ рдФрд░ рдмреЛрд░рд╛рди рдХреЛ рдЖрд░рдореНрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп:
 vector<bohr_vrtx> bohr; bohr_vrtx make_bohr_vrtx(){ bohr_vrtx v; //(255)=(2^8-1)=(     )=(-1     4-  int) memset(v.next_vrtx, 255, sizeof(v.next_vrtx)); v.flag=false; return v; } void bohr_ini(){ //   -  bohr.push_back(make_bohr_vrtx()); } 



рдмреЛрд░рд╛рди рдореЗрдВ рдПрдХ рдирдореВрдирд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛрдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛:
 void add_string_to_bohr(const string& s){ int num=0; //   for (int i=0; i<s.length(); i++){ char ch=s[i]-'a'; //    if (bohr[num].next_vrtx[ch]==-1){ //-1 -    bohr.push_back(make_bohr_vrtx()); bohr[num].next_vrtx[ch]=bohr.size()-1; } num=bohr[num].next_vrtx[ch]; } bohr[num].flag=true; pattern.push_back(s); bohr[num].pat_num=pattern.size()-1; } 



рдПрдХ рдмреЛрд░ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ:
 bool is_string_in_bohr(const string& s){ int num=0; for (int i=0; i<s.length(); i++){ char ch=s[i]-'a'; if (bohr[num].next_vrtx[ch]==-1){ return false; } num=bohr[num].next_vrtx[ch]; } return true; } 



рдмреЛрд░реЙрди рдорд╢реАрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг


рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рд╡рд┐рд╡рд░рдг


рд╣рдорд╛рд░рд╛ рдХрд╛рдо рдПрдХ рдкрд░рд┐рдорд┐рдд рдирд┐рд░реНрдзрд╛рд░рдХ рдСрдЯреЛрдореЗрдЯреЛрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реИред рдпрд╣рд╛рдБ рдРрд╕рд╛ рдХреНрдпрд╛ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдПрдХ рдСрдЯреЛрдореЗрдЯрди рдХреА рд╕реНрдерд┐рддрд┐ рдПрдХ рдмреЛрд░рд╛рди рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдЪреЛрдЯреА рд╣реИред рд░рд╛рдЬреНрдпреЛрдВ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди 2 рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡рд░реНрддрдорд╛рди рд╢реАрд░реНрд╖ v рдФрд░ рдкреНрд░рддреАрдХ chред рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдореЗрдВ рдЗрд╕ рд╢рд┐рдЦрд░ рд╕реЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рд╡рд░реНрдЯреЗрдХреНрд╕ рдпреВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд▓рд╛рдЗрди рд╡реА рдХреЗ рдкреНрд░рддреНрдпрдп (рд╕рдВрднрд╡рддрдГ рд╢реВрдиреНрдп) + рд╡рд░реНрдг ch рд╕реЗ рдорд┐рд▓рдХрд░ рд╕рдмрд╕реЗ рд▓рдВрдмреА рд░реЗрдЦрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдмреЛрд░ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдЬрдбрд╝ рддрдХ рдЬрд╛рддреЗ рд╣реИрдВред

рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдирд┐рд░рдВрддрд░ рд╕рдордп рдореЗрдВ, рдЬрд▓реНрджреА рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╢реАрд░реНрд╖ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрд╕ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди [i..j] рдХреЗ рдЕрдиреБрд░реВрдк рдмреЛрд░реЙрди рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╢реАрд░реНрд╖ рдкрд░ рдЦрдбрд╝реЗ рд╣реИрдВ, рд╡реЗ рдШрдЯрдирд╛рдПрдБ рдЬрд┐рдирдореЗрдВ рд╣рдо рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВред рдЕрдм рд╣рдо рдмреЛрд░реЛрди рдХреА рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпрдп рд╣реИ [i..j]ред рдпрд╣ рдЖрд░реЛрдк рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЬрд▓реНрджреА рд╕реЗ рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдмрд╛рдж рдореЗрдВ рд╡рд░реНрдгрд┐рдд)ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдмрд╕ рдЖрдЯреЛрдореИрдЯрди рд╡реА рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рд░рд╛рдЬреНрдп u рддрдХ рдкреНрд░рддреАрдХ s [j + 1] рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЦреЛрдЬ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред

рдЫрд╡рд┐
(рдЪрд┐рддреНрд░ 3)
рдСрдЯреЛрдореЗрдЯрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╢реАрд░реНрд╖ рд╕реЗ рдПрдХ рдкреНрд░рддреНрдпрдп рд▓рд┐рдВрдХ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкреНрд░рддреНрдпрдп рд▓рд┐рдВрдХ


рд╣рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╡рд░реНрдЯреЗрдХреНрд╕ рдпреВ рдкрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпреВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡реА рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЙрдЪрд┐рдд рдкреНрд░рддреНрдпрдп рд╣реИ, рдпрд╛, рдЕрдЧрд░ рдмреЛрд░ рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рд╡рд░реНрдЯреЗрдХреНрд╕ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд░реВрдЯ рдХрд░реЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд░реВрдЯ рд╕реЗ рдПрдХ рд▓рд┐рдВрдХ рдЗрд╕рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдмреЛрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдп рд▓рд┐рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░ рдкреНрд░рддреНрдпрдп рдХреЛ рд╢реБрд░реВ рдХрд░рдХреЗ рд╢реАрд░реНрд╖ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╢реАрд░реНрд╖ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВрдЧреЗред
рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди:
 struct bohr_vrtx{ //... int suff_link; //suff_link -   }; bohr_vrtx make_bohr_vrtx(){ bohr_vrtx v; //... v.suff_link=-1; // - .   return v; } 



рдпрд╣рд╛рдБ рдПрдХ рдкреНрд░рддреНрдпрдп рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЕрдВрдЬреАрд░ рдореЗрдВ рдмреЛрд░реЙрди рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХред 1:
рдЫрд╡рд┐
(рдЪрд┐рддреНрд░ 4)

рд╕реНрд╡рдЪрд╛рд▓рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдПрдХ рдСрдЯреЛрдореЗрдЯрди рдХреЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдВрдХреНрд░рдордг рдХреА рд╕рдорд╕реНрдпрд╛ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдмрд╛рдж, bohr.size () * k рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╡ рд╢реАрд░реНрд╖ рдФрд░ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рддреАрдХ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдВрдХреНрд░рдордг рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреВрд░реНрд╡-рдЧрдгрдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдФрд╕рдд рдЪрд▓рдиреЗ рдХреЗ рд╕рдордп рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрд▓рд╕реА рдЧрддрд┐рдХреА рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рд╣рдо рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдиреЗрдВрдЧреЗ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВрдЧреЗред
рд╣рдо рд╕рдВрдХреНрд░рдордг (v, ch) рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдХрд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ: рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╢реАрд░реНрд╖ рд╕реЗ рдкреНрд░рддреАрдХ ch рдХреЗ рд╕рд╛рде рдХреЛрдИ рдмрдврд╝рдд рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВрдЧреЗ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдкреНрд░рддреНрдпрдп рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдирдП рд╢реАрд░реНрд╖ рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдХрд╛рдо рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИред

рдЫрд╡рд┐
(рдЪрд┐рддреНрд░ 5)

рдПрдХрдорд╛рддреНрд░ рд╕рд╡рд╛рд▓ рдкреНрд░рддреНрдпрдп рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдКрдкрд░ рд╕реЗ рд▓рд┐рдВрдХред рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ, рдЖрдк рдЖрд▓рд╕реА рдЧрддрд┐рдХреА рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рдкреНрд░рддреНрдпрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╡рд░реНрдЯреЗрдХреНрд╕ v (рд▓рд┐рдВрдХ s [i..j]) рдХреЗ рд▓рд┐рдВрдХ рдЗрд╕рдХреЗ рдкреВрд░реНрд╡рдЬ рд╕рдорд╛рдВрддрд░ рддрдХ рдЬрд╛рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВред рд▓рд┐рдВрдХ рдмрд░рд╛рдмрд░ рдФрд░ рдкреНрд░рддреАрдХ рд╕рд┐рдореНрдм рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рд╢реАрд░реНрд╖ рдЯреА рд╕реЗ рд╕рдВрдХреНрд░рдордг рд╢реБрд░реВ, рдЬреЛ рдХрд┐рдирд╛рд░реЗ рд╕реЗ v рддрдХ рд▓рд┐рдЦрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдкреНрд░рддреНрдпрдп s [i..j-1] рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдкреНрд░рддреАрдХ рд╕рд┐рдВрдмрд▓ рдХреЗ рд╕рд╛рде рдмрдврд╝рдд рд░рдЦрддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо рдЗрд╕ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкрд░рд┐рдгрд╛рдореА рд╢реАрд░реНрд╖ рд╡рд░реНрдЯрд┐рдХреНрд╕ v рд╕реЗ рдПрдХ рдкреНрд░рддреНрдпрдп рд▓рд┐рдВрдХ рд╣реИред

рдЫрд╡рд┐
(рдЪрд┐рддреНрд░ 6)

рддреЛ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдСрдЯреЛрдореЗрдЯрди рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкреНрд░рддреНрдпрдп рд▓рд┐рдВрдХ рдФрд░ рд╕рдВрдХреНрд░рдордг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдЖрдкрд╕ рдореЗрдВ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред рдЙрдирдХрд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди 2 рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдкреБрди: рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛ рдЖрдзрд╛рд░ рд╕реВрдл рд╣реИред рдЬрдбрд╝ рд╕реЗ рдпрд╛ рдЬрдбрд╝ рдХреЗ рдмреЗрдЯреЗ рд╕реЗ рдПрдХ рд╕рдВрджрд░реНрдн рдЬрдбрд╝ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдирдИ рд╡рд░реНрдЯреЗрдХреНрд╕ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрджрд▓реЗрдВрдЧреЗ:
 struct bohr_vrtx{ //... int auto_move[k],par; //auto_move -   , par - -   char symb; //    par    }; bohr_vrtx make_bohr_vrtx(int p,char c){ //         bohr_vrtx v; //... memset(v.auto_move, 255, sizeof(v.auto_move)); v.par=p; v.symb=c; return v; } 



рдСрдЯреЛрдореЗрдЯрди рдХреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
 int get_auto_move(int v, char ch); int get_suff_link(int v){ if (bohr[v].suff_link==-1) //    if (v==0||bohr[v].par==0) // v -    v -  bohr[v].suff_link=0; else bohr[v].suff_link=get_auto_move(get_suff_link(bohr[v].par), bohr[v].symb); return bohr[v].suff_link; } int get_auto_move(int v, char ch){ if (bohr[v].auto_move[ch]==-1) if (bohr[v].next_vrtx[ch]!=-1) bohr[v].auto_move[ch]=bohr[v].next_vrtx[ch]; else if (v==0) bohr[v].auto_move[ch]=0; else bohr[v].auto_move[ch]=get_auto_move(get_suff_link(v), ch); return bohr[v].auto_move[ch]; } 



"рдЕрдЪреНрдЫрд╛" рдкреНрд░рддреНрдпрдп рд▓рд┐рдВрдХ рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВ


рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдорд╢реАрди рдХреЗ рд╕рд╛рде рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ: рд╣рдо рд▓рд╛рдЗрди рдкрдврд╝рддреЗ рд╣реИрдВ, рд▓рд╛рдЗрди рдХреЗ рдкрд╛рддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд░рд╛рдЬреНрдп рд╕реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдореЗрдВ рд╣рдо рдкреНрд░рддреНрдпрдп рджреНрд╡рд╛рд░рд╛ рдЪрд▓рддреЗ рд╣реИрдВред рдорд╢реАрди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рдЗрди рдХреЗ рдкреНрд░рддреНрдпрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛, рдЬрдмрдХрд┐ рдмреЛрд░ рдореЗрдВ рдЙрдирдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред
рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЕрд╣реЛ-рдХреЛрд░рд╕рд┐рдХ рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рджреНрд╡рд┐рдШрд╛рдд рд╕реНрдкрд░реНрд╢реЛрдиреНрдореБрдЦ рд╣реИ - рд░реАрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрд╕ рдХреА рд▓рдВрдмрд╛рдИред рджрд░рдЕрд╕рд▓, рд░рд╛рдЬреНрдп v рд╕реЗ рдПрдХ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП v.length () рдкреНрд░рддреНрдпрдп рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд░рд╛рдЬреНрдп рд╕реЗ рдПрдХ рд╕рдВрдХреНрд░рдордг рдЗрд╕ рд░реЗрдЦрд╛ рдХреА рд▓рдВрдмрд╛рдИ 1 рддрдХ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИред Tsimes souf рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИред рд▓рд┐рдВрдХ рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдЬреЛ рдирдореВрдирд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдмреАрдЪ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рд╣рдо "рдЕрдЪреНрдЫреЗ" suf рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВред suff_flink рд▓рд┐рдВрдХред рддреЛ, рдмреЛрд╣реНрд░ [v] .suff_flink рдмреЛрд░ рдореЗрдВ рдирд┐рдХрдЯрддрдо рдкреНрд░рддреНрдпрдп рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ = рд╕рддреНрдп рд╣реИред рдРрд╕реЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ "рдХреВрдж" рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреА рдФрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЦреЛрдЬ рдХреА рдЧрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрдиреБрдкрд╛рддрд┐рдХ рд╣реЛрдЧреАред

рдЫрд╡рд┐
(рдЪрд┐рддреНрд░ 7)

рдлрд┐рд░ рд╕реЗ рд╣рдо рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрджрд▓реЗрдВрдЧреЗ:
 struct bohr_vrtx{ //... int suff_flink; //suff_flink - "" .  }; bohr_vrtx make_bohr_vrtx(int p,char c){ bohr_vrtx v; //... v.suff_flink=-1; return v; } 



рдЙрдирдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд╕рднреА рдПрдХ рд╣реА рдЖрд▓рд╕реА рдЧрддрд┐рд╢реАрд▓рддрд╛ред рд╣рдо "рдЕрдЪреНрдЫрд╛" рдпреЛрдЧ рдЧрд┐рдирдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВред рд▓рд┐рдВрдХред рдпрджрд┐ рдКрдкрд░ рд╕реЗ рдкреАрдбрд╝рд┐рдд рдХреЗ рд▓рд┐рдПред рд▓рд┐рдВрдХ рдзреНрд╡рдЬ = рд╕рд╣реА рд╣реИ, рддреЛ рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рд╢реАрд░реНрд╖ рд╣реИ, рдЕрдиреНрдпрдерд╛, рд╣рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЙрд╕реА рд╢реАрд░реНрд╖ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдЕрдЪреНрдЫреЗ рдпреЛрдЧ рдХреА рдЧрдгрдирд╛ред рд▓рд┐рдВрдХ:
 int get_suff_flink(int v){ if (bohr[v].suff_flink==-1){ int u=get_suff_link(v); if (u==0) // v - ,  .  v    bohr[v].suff_flink=0; else bohr[v].suff_flink=(bohr[u].flag)?u:get_suff_flink(u); } return bohr[v].suff_flink; } 



рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЦреЛрдЬ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЦреЛрдЬ рдХреЛ рдорд╛рдореВрд▓реА рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ "рдЕрдЪреНрдЫреЗ" рдпреЛрдЧреА рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓рд┐рдВрдХ рдЪреЗрдХ (v, i) рдСрдЯреЛрдореЗрдЯрди v рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рддрд┐ рд╢рдмреНрдж рдореЗрдВ i-th рдЕрдХреНрд╖рд░ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИред

рдЬрд╛рдВрдЪ (v, i)
 void check(int v,int i){ for(int u=v;u!=0;u=get_suff_flink(u)){ if (bohr[u].flag) cout<<i-pattern[bohr[u].pat_num].length()+1<<" "<<pattern[bohr[u].pat_num]<<endl; } } 



рдпрд╣рд╛рдБ рдЦреЛрдЬ рд╣реА рд╣реИ:
 void find_all_pos(const string& s){ int u=0; for(int i=0;i<s.length();i++){ u=get_auto_move(u,s[i]-'a'); check(u,i+1); } } 



рдФрд░ рдпрд╣рд╛рдБ рдХрд╛рдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
  bohr_ini(); add_str_to_bohr("abc"); add_str_to_bohr("bcdc"); add_str_to_bohr("cccb"); add_str_to_bohr("bcdd"); add_str_to_bohr("bbbc"); find_all_pos("abcdcbcddbbbcccbbbcccbb"); 


рдЪрд▓ рд░рд╣рд╛ рд╣реИ:
1 рдПрдмреАрд╕реА
2 рдмреА.рдбреА.рд╕реА.рд╕реА.
6 bcdd
10 рдмреАрдмреАрд╕реАрдмреА
13 рд╕реАрд╕реАрдмреАрдмреА
16 рдмреА.рдмреА.рд╕реА.
19 рд╕реА.рд╕реА.рдмреА.


рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рднрдВрдбрд╛рд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЖрдХрд▓рди


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдореМрдЬреВрджрд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рдВрдмрд╛рдИ s (N = s.length ()) рдХреЗ рд╕рд╛рде рдПрдХ рдЪрдХреНрд░ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА O (N * O (рдЪреЗрдХ)) рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЪреЗрдХ рдХреЗрд╡рд▓ рдЭрдВрдбреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдмреВрдЭрдХрд░ рдЪрд┐рд╣реНрдирд┐рдд рдЦрд╛рдорд┐рдпреЛрдВ рдкрд░ рдХреВрджрддрд╛ рд╣реИред , рдлрд┐рд░ рд╕рд╛рдорд╛рдиреНрдп рдПрд╕рд┐рдореНрдкреЛрдЯрд┐рдХреНрд╕ рдХреЛ рдУ (рдПрди + рдЯреА) рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЯреА рдПрд╕ рдореЗрдВ рд╕рднреА рдирдореВрдирд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдСрдЯреЛрдореЗрдЯрди рдФрд░ рдкреНрд░рддреНрдпрдп рдХреА рдЧрдгрдирд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВред рд▓рд┐рдВрдХ, рддрдм рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо O (M * k + N + t) рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ M = bohr.size ()ред рдореЗрдореЛрд░реА - рдмреЛрд░реЙрди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ k рдХреА рдирд┐рд░рдВрддрд░ рд╕рд░рдгрд┐рдпрд╛рдБ, рдЕрдиреБрдорд╛рди O (M * k) рд╕реЗ рдЖрддреА рд╣реИред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рднрдВрдбрд╛рд░рдг рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡рд░реНрдгрдорд╛рд▓рд╛ рддрдХ рдкрд╣реБрдВрдЪ, рдЗрд╕ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рд╕рд░рдгреА рдХреЗ рдмрдЬрд╛рдп рдорд╛рдирдЪрд┐рддреНрд░ <char, int> рдореИрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ рдкрдврд╝рддреЗ рд╣реИрдВ , рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрд╕рдЯреАрдПрд▓ рд╕реЗ рдирдХреНрд╢рд╛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдПрдХ рд▓рд╛рд▓-рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рд╕рдордп рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рдШреБрдЧрдгрдХ рдХреЗ рд▓рд┐рдП рдЖрдиреБрдкрд╛рддрд┐рдХ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд░реНрдгрдорд╛рд▓рд╛ k (рдЬреЛ рд▓рдЧрднрдЧ рд╕реНрдерд┐рд░ рд╣реИ) рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд▓рдШреБрдЧрдгрдХ рд╣реИред рдХреБрд▓ рд╕рдордп O ((M + N) * log k + t) рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдПрдХ рд╕рд░рдгреА рд╕реЗ рдХрд╛рдлреА рддреЗрдЬ рд╣реИред рдорд╛рдирдЪрд┐рддреНрд░ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрдореЛрд░реА рдмреЛрд░ рдореЗрдВ рдХрд┐рдирд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрдиреБрдкрд╛рддрд┐рдХ рд╣реИ (рдФрд░ рдЗрд╕рд▓рд┐рдП рдмреЛрд░ рдореЗрдВ рдХреЛрдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдПрдо рдХреЛрдиреЗ рд╡рд╛рд▓реЗ рдкреЗрдбрд╝ рдореЗрдВ рдПрдо -1 рдХрд┐рдирд╛рд░реЗ рд╣реИрдВ)ред рдорд╢реАрди рд╕рдВрдХреНрд░рдордг рдЧрдгрдирд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП рдЖрдиреБрдкрд╛рддрд┐рдХ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдЕрдиреБрдорд╛рди O (M + N) рд╣реИред

рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк next_vrtx [k], auto_move [k]рд▓рд╛рд▓-рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдХреЗ рдирдХреНрд╢реЗ рдХреЗ рд╕рд╛рде рд╡реЗрд░рд┐рдПрдВрдЯ <char, int>
рд╕рдордп рдХреА рдЬрдЯрд┐рд▓рддрд╛O (M * k + N + t)O ((M + N) * рд▓реЙрдЧ k + t)
рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреА рдЬрдЯрд┐рд▓рддрд╛O (M * k)O (M + N)


рдкреБрдирд╢реНрдЪ : рдпрд╣рд╛рдБ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд╛рд░реНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЕрд╣реЛ-рдХреЛрд░рд╕рд┐рдХ рдПрд▓реНрдЧ ред

Source: https://habr.com/ru/post/In198682/


All Articles