package Ġcom . hy os ak ura . regex parser . code Ċ Ċ import Ġcom . hy os ak ura . regex parser . autom ata . Auto M ata Ċ import Ġcom . hy os ak ura . regex parser . autom ata . Edge Ċ import Ġcom . hy os ak ura . regex parser . autom ata . State Ċ import Ġjava . util . stream . Collectors Ċ Ċ /** Ċ Ġ* Ġ@ author ĠL ov es As una Ċ Ġ**/ Ċ class ĠCPP Generator Ġ: ĠCode Generator Ġ{ ĊĠĠĠ Ġprivate Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate ( autom ata : ĠAuto M ata < State , ĠEdge >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . clear () ĊĠĠĠĠĠĠĠ Ġgenerate Start () ĊĠĠĠĠĠĠĠ Ġgenerate Binary Search () ĊĠĠĠĠĠĠĠ Ġgenerate Main ( autom ata ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ# include Ġ< iostream > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ# include Ġ< string > ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġusing Ġnamespace Ġstd ; ĊĊĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Binary Search () Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbool Ġfind ( int Ġtarget , Ġconst Ġint Ġarray [], Ġint Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( length Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġleft Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġright Ġ= Ġlength ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ[ left , Ġright ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( left Ġ< Ġright ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġmid Ġ= Ġleft Ġ+ Ġ( right Ġ- Ġleft ) Ġ/ Ġ 2 ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( array [ mid ] Ġ>= Ġtarget ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġmid ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( array [ mid ] Ġ< Ġtarget ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġmid Ġ+ Ġ 1 ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġ>= Ġlength Ġ|| Ġarray [ left ] Ġ!= Ġtarget ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġ* cast ( const Ġstring Ġ& str ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġchar Ġ* data Ġ= Ġstr . c _ str (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġlength Ġ= Ġstr . length (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġ* array Ġ= Ġnew Ġint [ length ]; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( int Ġi Ġ= Ġ 0 ; Ġi Ġ< Ġlength ; Ġi ++) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ i ] Ġ= Ġdata [ i ]; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġarray ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġcollection ToArray ( collection : ĠCollection < T >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcollection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("[ ", Ġ"{ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" ]", Ġ" }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Main ( autom ata : ĠAuto M ata < State , ĠEdge >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaccept Ġ= Ġautom ata . accept States ĊĠĠĠĠĠĠĠ Ġbuilder . append ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Ċ int Ġmain () Ġ{ ĊĠĠĠ Ġchar Ġch ; ĊĠĠĠ Ġint Ġstate Ġ= Ġ 1 ; ĊĠĠĠ Ġint Ġaccept [ ${ accept . size }] Ġ= Ġ${ collection ToArray ( accept . stream (). map Ġ{ Ġit . id Ġ}. sorted (). collect ( Collectors . toList ())) }; ĊĠĠĠ Ġwhile Ġ( cin . get ( ch ) Ġ&& Ġch Ġ!= Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠ Ġ${ generate While ( autom ata )} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( find ( state , Ġaccept , Ġ${ accept . size })) Ġ{ ĊĠĠĠĠĠĠĠ Ġcout Ġ<< Ġ" accept !" Ġ<< Ġendl ; ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġcout Ġ<< Ġ" error !"; ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ 0 ; Ċ } ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate While ( autom ata : ĠAuto M ata < State , ĠEdge >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( id Ġin Ġautom ata . state Map . values . stream (). map Ġ{ Ġit . id Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( generate Case ( autom ata , Ġid )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ""" switch Ġ( state ) Ġ{$ builder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault : Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ Ġ} """ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Case ( autom ata : ĠAuto M ata < State , ĠEdge >, Ġid Ġ: ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġedges Ġ= Ġautom ata . get Edges ( id ) ĊĠĠĠĠĠĠĠ Ġfun Ġ` if `( edge Ġ: ĠEdge ) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ""" ĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( find ( ch , Ġcast ("${ edge . symbol . join ToString ("") } "), Ġ${ if Ġ( edge . symbol . contains ( null )) Ġ 0 Ġelse Ġedge . symbol . size })) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġ${ edge . next }; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġelse If ( edge Ġ: ĠEdge ) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ""" Ċ Ċ | ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( find ( ch , Ġcast ("${ edge . symbol . join ToString ("") } "), Ġ${ if Ġ( edge . symbol . contains ( null )) Ġ 0 Ġelse Ġedge . symbol . size })) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġ${ edge . next }; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġ` else `( next Ġ: ĠInt ) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ""" Ċ Ċ | ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġ$ next ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġedges . iterator () ĊĠĠĠĠĠĠĠ Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (` if `( iterator . next ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( edges . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( else If ( iterator . next ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (` else ` (- 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcase Ġ$ id : Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} """ ĊĠĠĠ Ġ} Ċ }