▁table . ▁ ▁A LP H AB ET _ SIZE ▁= ▁ 2 6 ▁ ▁def ▁alphabet _ index ( c : ▁str ) ▁-> ▁int : ▁▁▁▁ ▁""" Return ▁the ▁index ▁of ▁the ▁given ▁character ▁in ▁the ▁English ▁alphabet , ▁counting ▁from ▁ 0 ." "" ▁▁▁▁ ▁val ▁= ▁ord ( c . lower ()) ▁- ▁ord (' a ') ▁▁▁▁ ▁assert ▁val ▁>= ▁ 0 ▁and ▁val ▁< ▁A LP H AB ET _ SIZE ▁▁▁▁ ▁return ▁val ▁ ▁def ▁match _ length ( S : ▁str , ▁idx 1 : ▁int , ▁idx 2 : ▁int ) ▁-> ▁int : ▁▁▁▁ ▁""" Return ▁the ▁length ▁of ▁the ▁match ▁of ▁the ▁sub strings ▁of ▁S ▁beginning ▁at ▁idx 1 ▁and ▁idx 2 ." "" ▁▁▁▁ ▁if ▁idx 1 ▁== ▁idx 2 : ▁▁▁▁▁▁▁▁ ▁return ▁len ( S ) ▁- ▁idx 1 ▁▁▁▁ ▁match _ count ▁= ▁ 0 ▁▁▁▁ ▁while ▁idx 1 ▁< ▁len ( S ) ▁and ▁idx 2 ▁< ▁len ( S ) ▁and ▁S [ idx 1 ] ▁== ▁S [ idx 2 ]: ▁▁▁▁▁▁▁▁ ▁match _ count ▁+= ▁ 1 ▁▁▁▁▁▁▁▁ ▁idx 1 ▁+= ▁ 1 ▁▁▁▁▁▁▁▁ ▁idx 2 ▁+= ▁ 1 ▁▁▁▁ ▁return ▁match _ count ▁ ▁def ▁fundamental _ pre process ( S : ▁str ) ▁-> ▁List [ int ]: ▁▁▁▁ ▁""" Return ▁Z , ▁the ▁Fund amental ▁Pre processing ▁of ▁S . ▁▁▁▁▁ ▁Z [ i ] ▁is ▁the ▁length ▁of ▁the ▁substring ▁beginning ▁at ▁i ▁which ▁is ▁also ▁a ▁prefix ▁of ▁S