heh
-rw-r--r--Cargo.toml4
-rw-r--r--src/inp.txt2252
-rw-r--r--src/main.rs217
-rw-r--r--src/util.rs173
4 files changed, 1170 insertions, 1476 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 14af4b6..4cfdf4e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,8 +6,12 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+atools = "0.1.5"
+hinted = "0.0.1"
itertools = "0.12.0"
memchr = "2.6.4"
+radsort = "0.1.1"
+rustc-hash = { version = "2.1.0", features = ["nightly"] }
[profile.release]
lto = true
codegen-units = 1
diff --git a/src/inp.txt b/src/inp.txt
index 58449f1..86c469c 100644
--- a/src/inp.txt
+++ b/src/inp.txt
@@ -1,1252 +1,1000 @@
-pzt: zfx qdv
-tzg: bqj
-fcj: znv sjk pqc zcr
-jrm: qpf lrs xgm
-dxx: lrz xvc pcs
-zbt: vpp khl hnc
-pjt: jbr
-qpf: trv gnl
-jjd: pnj lfr sdv
-xrt: lkc qfj bmx rtt
-vvl: mkq
-cdn: kkz fdl hsr
-sgq: xqd
-htv: qcb vgz jdz fqd llm
-mkp: kmj ktt dbg
-txd: hrf bcf lpr
-scv: jmj jdf glc
-kpx: xmd jqh
-zhj: qbq sqr rqr tvg tjs cnz
-vtf: slb gxt mrg
-bkc: gmk rmk
-jrj: xpg rsz qnp sln
-nbf: vcz tbn nfb
-xfz: jgh dkp mkc
-hsr: bqh vpp fkq
-dbc: hfb ksl fgs
-qls: pgg
-kvn: hfp
-fcr: vzx lfl jmj pmn spt sjl lgg
-kpq: jkj sjz dkc zhq
-dst: ftf thj smm ltr dkb pzt
-fgv: tzz prd hcq dkr
-qcr: vqs
-khl: fdl fbd
-gsn: rlm
-xrm: dkc
-sqf: mzj tkj ntf
-fpt: tmn dmp bls
-kst: cqt pmr
-lbb: gnd jtz dpm cmq cgr
-sjz: rxv kcp xpf xck mpp ddr dcm
-scs: kkg gxz
-mdq: sdh ldj dsg
-ppm: mjg kmd
-qbl: cmh vdz
-svb: jqr jsx
-bfb: fml bln xkj
-jnh: qbq vfd kqh
-fqz: ctq fqc zfb
-ndl: xmk njr
-zzx: nnf qqh tgm kzh kmr
-svm: rpb fpg pkc grk
-crm: smm dlg gnl vgz vnp
-qkf: jtr cvv ghs khg ntd
-rll: cbx vgt zfb
-spt: znb
-ckr: bfd xxq zkm
-nnd: kkz msm tdz gxk
-pmc: xkf tnr pbq
-pxf: tsp zcv
-fxh: rxl sxn zbb rmc
-mqs: mzj vkc
-jkl: xrl vln zpf lvg
-tkx: zgz vpp knn mzc
-bml: qcm tcq lvz lqs
-cfn: pjd
-pnj: pcc khl mbf bzp
-fsm: snd gmr mqf nrg
-ftt: hnc qrr qfb smr
-dhr: dpc
-mns: gbd tqh
-cdr: xvj sxn kcq
-cfc: zbh
-tlt: qxd xxg xlq jnx
-kkx: ltv
-jqq: pzv bkv jlk
-brr: sqf mrn mkp hmc sjz
-qgg: srn lvp dsg
-jnx: rpd scv
-cjc: xlh stk fdp
-ktb: rjx qdh szh sfq
-zfb: jzq
-fdz: dfp rsz
-phl: djf gql
-dxg: gxk skv
-qcx: pfp kmx spt ghp
-hhd: qzv qqh
-xsm: gxt hkb xtk cbx
-lkn: fnl htd mjt kvm
-xpk: gtl pxx gmh
-kxz: gmz mmm hpk
-ksq: jbr sdv hpt sfl
-mcx: mzg qcm mhc hgt
-pdk: lvg xfc jkv nfj
-nhk: kmd zgh ckr
-nnt: qxc pnj bdp sqz
-qfq: npp vnr fsq kgh
-ggq: xpg qlc nnx qjq
-nrm: rzv bln
-krc: xsz znt
-llv: vkm xfq xbk xvk
-tgm: vjt fmc
-bxg: jlv lvz
-vld: xgt
-hpt: tzp dtm vgq lmj glv
-qvx: tnr czl snh jmb
-qtf: dsj vtn
-zdp: ffr cbq tcp
-lxx: qkp pzt plr
-sdc: spr zbh
-bkq: zfx knp
-dhn: xkj hjr rnh
-jbx: nnm vgk
-kqk: xvx mhm ffv
-slb: lrt jcg rkb
-lvj: ffv ntl stz
-mpt: ztk
-jdg: mzp fcf jxv pxp
-slr: jjd svr jcg
-mdj: qrk vck jzx fqb
-nqp: hkk szb
-mlh: fhq
-thc: pqm rsh
-nrt: nrm btg qhr mpc kst
-smm: gnt
-jpm: plr
-qsv: fhq pbl kqk fjx qbl
-jlm: zdd czn bmr lcx
-sps: zgz jbr
-dtm: str
-vkh: btx
-hcp: fmc
-pmf: lnq vxb qfj mqf
-xvk: svl jbr mzz
-ftj: cnf dxp mjg hrz
-jmn: ddr sxv mzb nzk lgz dhp
-bjc: xxg
-snx: dbf pbm cjc xfz hlm gcn
-pbm: kps bkr rsr
-jjl: sfq drk rgv gcl
-dmt: ktp
-zzd: qnv
-tct: ftz glc dqc
-ssq: jcb
-dfl: qvt zcp mtn kcr
-xsn: fdl gqd vqs
-gch: sbt brs sct cmq gln
-tpb: nfg rpb trg bhh
-bmr: zxq vgh mts
-hhr: bhd xhf jcb krx
-hls: mkq rjx rzj
-spq: msq cmh rgv ddv pfp
-vhn: hnq sls bnc fdv
-fkk: gpm rdx kxb ndd
-lkg: qpf xpp
-qgc: mjm mct gbr
-hhq: gjp tmh tcp sgz
-nlz: vkc jgb xmd fbh
-lrs: fpm
-ghg: nzk kfs gqk
-jqt: glv bfb fpl btk
-rdt: nkx pzg
-fbd: skn
-dpj: pjs
-vkm: xgt pxp gdv
-lvq: mds mdq lxk xtg
-dxl: grb hjc srj
-jxr: sfl mbz nnc fbd
-qtk: pbq
-knp: tmd
-phb: vgk
-nsv: phl rnj szh cgr
-bnd: zdg xlj mjg
-fxd: xjk dbt fkq vnr
-vzh: nnm dfq htd jqg
-ggx: ntz bkr fzq zjf
-rkb: tzp xmh glj
-sxv: rsr nzh
-pkf: kcp hpk vsh
-gdz: bll fmc
-hjs: dhk
-qhg: gln
-mgq: bkc xnh xvj xkf rpd
-rsd: lsl znb hcq
-mgr: kvl
-lqb: nss fpl hkb gsn jzk
-npq: grk ddk rsh vfq
-gcn: mrq mzb brs sfp
-rff: cvn
-fdx: xfq gjq
-tqm: pqm bgx
-ntp: fbd scj cbq
-pfg: ckb vkh vxb rtl
-xpg: jsg zdf
-djf: szb zpk
-vft: hcq xkf
-ldj: pqm
-jbk: jdz nfq gmj hkk jsn
-rqj: qts kvj pdd cpn
-crx: vpp
-dsv: zpk vxr bkn
-mhm: rpp mpg nzk kmr
-kcf: sfn
-nkx: jlp
-rvh: lrs zlp rgd rkj
-ffq: ksk lzm bnm spn qqt
-pxs: cfc kvj zrc xjn
-jjv: rhp pkf lvb
-ntz: mzj nsg
-dmx: zln pbl fdp mkc ppk
-dqb: pxg gcq sjk lnx blz
-bss: tdq jrk
-qjv: xtp kcj bmx vcq zcg
-bxj: vnl xfl
-ntc: tng
-khm: jcb qpd
-mzd: fzq dvp brh zxl
-rqm: gbq
-ldb: tmg
-tsq: cfn frd xck rxl
-qpr: lnq lfd qfb
-ckb: lxk nfb
-rlk: gxm pfr tbh gql
-kcb: ssh pcc
-lfc: ltm hdg xrf hrf
-xjm: kgr cbn vpf dlz dgh
-pzv: qrs njj
-vpj: qbq
-vxf: lhk
-mjp: tch pzg zlb mts
-jlt: vdz mtb
-blz: ftx
-pkc: vrt pzr
-spn: rmn bff mdf
-rnk: fbd cqt
-ckj: jkv djf cxq llm ndn
-jmz: sjh cjg nlz jgh
-nzz: nzs pqm nrg zhl
-lvb: dpj mzf
-jkj: zmz qls bqv
-bfc: dhk
-czq: klv ssh
-npp: jqs pjt bhh gpm
-jmj: lqs rsm sml
-vgx: nfc
-mfs: ffv
-scn: fhq
-svg: jlv
-jjc: tbb lzn
-rcs: vcf fnx gnz smr llk xsz dtm
-pvk: gvx bpd mrc vck stm
-dzb: pdq dlt tcr hvd
-dpg: pdd
-cjx: xsz vtn fjb grv
-jkf: nmc vlp pxj krp
-lmg: tvj jqh
-lxv: mrc xns gln
-dvn: rrn krc ndm
-jhh: ztj lcc bkn
-ntl: cvh
-rlj: vjj lnx pzg dfq
-mhj: lzm pgj lfp cbh
-tnr: qdt
-vjn: kkz zfb dtp sfn
-jsn: xpf
-mdf: ckj xfc zmt
-hjr: gbq mbx
-rqn: stm xlq
-dpf: kvk
-sgs: rhp
-mtm: tdb fqd lgx blr
-klh: tzg
-rsm: qfd
-fqb: dpf tmd hfp gvx
-ffv: kvk
-scf: rkt xns mcs nrf
-zzb: nft hcp nkh gxm
-lhs: klv dtp ffr shv
-xzx: fzt srn vxb ghs
-rjx: qkk djv
-lnm: vfp zhl gll czq
-snh: tdb vzn nrf mxn
-pzd: fhj bkh
-vhq: dsg ssn hdx zcr
-zrd: bll
-rxm: tcx kxb zgz
-htm: grb sbk pcm
-mpg: dvp jsx
-vlm: ttd dpx lss
-vnl: ksl txn
-czg: hrz gks kfl
-mkc: kns
-jjr: hkq cqm xqd tqj vbx
-fnl: qcl thc
-tgg: dxg nck fcn
-kgv: xgl ztk dfs
-lqs: bll
-xkl: hkk
-hmc: hkk
-ztb: rmp rxv jzz
-pzr: jdh qcd gsn svx
-zlg: gpm
-jvd: bjc crn brh lrn
-xhh: bzp gbq
-zdk: crn gks sct lqh
-vbq: nzh fzq sxn jgs
-txv: tkg qfk jlj bkr
-tzl: bcf
-cts: gjl vgk
-dcd: pkc gcp ndd rxm
-khj: lvz qfd rkt kcp
-lxz: dkc qgj ztb
-cbq: dgh
-ckl: mts shv
-gmh: rdr phb
-tmf: xzt gjl mzr
-cjr: fnl tsp ptq
-xhf: xpf btv
-qbf: tbh pcp
-hfp: xlj
-lgg: dbn ltv bnm
-gqd: zzd rdr
-rfm: hgf hjl vcz
-mcj: xkj hnh dhk
-xml: nkx
-xvf: czp
-drz: dpg pxk jtl
-hld: jzl krp lrt
-gjf: cjc qxd pfm lgz
-ctf: vkh
-mnh: fcm tsf qnv zbk tth
-gdg: cpn vjj vgk
-vtg: jsn mkp ddv tnr
-nft: ntq prb jjc lcc
-zqp: tkg jrm kmj
-szm: nfp vgh
-xmz: qbq tjp zvf
-mzp: bln dhn bvj xgl
-gvj: hjs xml
-nhx: pcl mrg
-xvc: pxk
-bmx: lhx htm khg xfl
-jqd: drp zjf msq lfl
-llm: mzb
-lns: cfn srv mrn
-scq: zcf slb lmp mpc
-cnt: zkn hgk knp lvj
-kbb: ktt nvf ccd mrn
-gpr: kpx hgl jsx bll
-dfm: fbp dbg xzq mmm
-qdk: czl
-smr: pcc
-hps: dng rfl
-lgv: jcg qcl fxk vfc
-nrf: hkk tmd
-lrt: blz
-svr: sps xbk khg
-dlt: sjh xvf
-qvt: vrn dxp ffx
-fcf: gcp nnm ntp
-jzk: xgt fqc mfs
-rnq: jsr vzx gqk ccr
-kmx: znb pgj lkg zdg vzx
-vxr: crn
-vxc: fgq
-jfr: kvn qdk rpd glc
-vtd: qbh xxg qkp ntl
-grv: zzd pjt sch
-jrk: grk
-mbx: xqb bgx
-rpz: xqb lrz tqz nbf pqc
-xsz: pjx
-qbh: zrr kns ntz
-jph: qkk
-xvx: mbj zbg pgj sln jnh
-cbd: zzd bgf cpn
-nfg: tzp jlp bsp
-gjp: lbs zlg hjp
-vqf: shv mpt jjf xtp btk xsn
-qrv: vjr dfq
-kxk: lvn vgn rff
-ksk: xvf
-stz: mzf ffx
-kzx: kcf rnh bzc dfs ztk
-tng: qbf
-ntm: zfb fdx qfb vhj
-pcl: ngs tdq
-xjt: pxk lhx mts
-nvl: ckr khm gql vkc
-rqr: vhg vdz
-knn: btg pxx
-fpl: nhg nrg
-gjq: vrh
-mxc: hnq nfc
-mct: xrm
-kjk: cvv fkq dlz
-ppk: ndn dxr jgs
-hkq: pjh
-rvc: dsg mgr pcl lmd
-rgl: xvf pgg gbd qlc qrk
-blr: rkj lpp tnr svf
-rcj: pjx fpt hfz rlj
-xlj: xgm
-hkb: klh gkd
-zcr: cfc qtf
-zvc: xqd ltv
-kvl: bgx
-djv: bnc mff ztj
-tzs: dfp dsv jlj nzm sln
-dgn: hcj vtf kst rdr
-glc: tjp gqj
-xnk: mns rmk czp gvx
-pcp: bjv
-srn: gjp xtg hdg
-lxk: rnh
-vfd: tdb dpc
-ngp: hgv gbq crx
-zsd: sdh bkz dgc
-lvk: nss grb mzn
-hgt: vsx
-xgl: bzp pkh
-dpt: mzg sxn xkl kps ppk
-flz: ncg hnn mrq xfc
-fgd: rph hfz dbc
-hbl: ghf jqq mfv gdg mpc
-gxh: crv nnd nhx
-vdn: kmd bjv
-cnc: rxq jfj svb
-ksl: sfn
-msm: pqm szm
-rdz: ckc cnc sxj lrs
-nnc: lbs jrk
-bvj: cvn xfl
-rsz: pcp
-mgs: nsx tsq vgz dsv
-pxx: xmh
-lvp: mxl
-btt: bhd dpc qlc
-ddv: jgb rps
-drp: xlq
-vln: gnd xxg
-rsj: jqt mpt hld vgt
-kzh: tgm jsn blx
-sdf: rff qrv htd fkf fhk dpg
-hgb: jvk tzv qmn vnz
-nvd: pzp tvj
-sjh: qzv
-svl: sdv hjs
-kzz: hlx bzp gtl
-rps: zfx srv jvk
-tcp: kbg
-qrk: dkr bkq
-vfk: cbx ppt
-mxh: xsj ftx hrf
-lcc: pfm
-rmm: hss dxr mrq
-xck: rsm
-mvr: jbk xnh zhh pbq ffv
-xmh: bfc
-htr: pxf chr gmm fgs bps rdr
-tkr: jnx bfd ntc xsd
-bdg: rpp gks qqm ctp
-rbg: klr zhh
-pmq: bcv knp glc
-jzl: nqf gsx qtr ctf vcd
-ddk: kkg lcx lhj
-tjb: htm chr vgt xjg
-vcq: tdz zdd
-llk: jbx jtl tlb rmd
-jqj: stk nfj vtb bjh kcr fkn bhc
-cbx: lnq
-txt: rbg kcp
-vnz: tzv tbg
-bhc: cqv zrz
-vzf: vkm trg lpj dmp
-qcl: fjb
-zxq: ssh gjl sbj mbz
-kqh: zrz vbx
-vhp: gjp vbg fqz
-nrp: znv
-kjl: rjg krp mxl
-rcg: mtr nxf kvm npr
-rqx: kvb nmc
-ntd: nbf cts
-bkz: zcv
-zgh: lqf bff nnn
-hgk: kns tcq qvl
-kqq: hnc vfp srn tmn tjb
-kgh: smr tbn pmr vfk
-chr: ngs kcb
-zxm: jqs ptq mxr
-lmp: hnh szc dqb xtk
-hrs: tmf fml
-mpc: cfc
-qkp: fbh
-ffx: ksk
-pnk: mct scn jbs slm
-fqm: sch knb nkx bzp
-blx: cvh hgl xkf
-pmr: hjs pxj
-gnj: fqj zxl rqg
-ngb: vds ljh qhr dfc
-cmq: gfx czl
-xfl: njr
-ggj: jmj lsl ttz jtz
-lss: ttz
-ktm: dng cqt fhc
-prx: zbh pjt
-hqj: czp jlv vtb vgc
-kgf: rsr
-vcz: hgv
-tgc: fkq ndl rjg
-cpf: nfc
-vtx: glj zdd fgs zxm lrb
-mtn: bjc djv gxm
-vrn: ssq
-cvg: cdp gln dkp
-htk: qzv bcq jmb vqr pmn xkf
-lrk: cvv msr
-zcf: scs
-skp: gmj hcp gnt zjk rxl
-krx: vxf jfj dgq vft
-xxg: cpf tdb
-vsh: rkt rxb
-tmh: qts tdn rnk xjk
-snd: jjf gjq pzg pbc
-mxk: ztz ztj kqs
-qnh: gks scn hkq hgk
-qvl: xvj
-dql: txn cdn rph zdp
-knb: ctq
-vxk: tjp
-zbk: kzh ffv xqd lbp
-qvv: jbs ldr bcq vkf
-cqt: xjn xgt hvk
-hjp: mgd
-nzm: khq qgc hjb tsf
-mnx: ktt
-ghs: ccj cqq
-qfk: nfj zrz
-vbg: khg pxg hnh
-cqv: fxb
-clp: ntd txd rkb kzk
-kjx: dhr qtk
-zcp: pzd dmt rbk
-rdd: qrs vgn lvn lcx mgd
-vnf: dlt qgc bcv
-fmt: zkn
-znb: jcb
-fdv: lmg fdz dbg skz ffd
-xdl: kss tnp ggh bqh pdh
-qgn: dlg jph rmc qbl
-ndt: fjb vkh hgv
-grb: nzs
-qtr: sfn ndl
-vrh: trg vds
-bnm: nsg gqk
-mqf: npr qrr
-xgx: dgh bxj nqv
-cxc: hrs vjs kpm
-nqv: dbj vgh nfp
-pnm: hgk mqs mzb vlm bkc rgr
-vgt: hgf ldb
-pcd: nzh fbh rgv kfs
-plr: mrc pzd tkj
-vrj: tcr dgx kvn
-fzt: sdc bqj
-gbh: zpf plz fdz zvf qkk
-vjt: rbk
-ljh: tbg skv tmg hdg vcf
-bzz: fgs nrg rdt vjj
-drq: cxc xgv tzl ksl
-dzx: lpr hfz tsr ssn knn
-xsj: srj mzc qnv
-xgv: nss jlk
-nnf: vmp czp
-bps: jxv ssh cbx
-xjk: sgj dtp ngm
-bkv: ddn qhr
-mzg: fmt
-cpk: hzn rrn bvj tdz
-vcf: rpb bzp
-vmf: lgk hhd bjv rqg hcp
-hrz: xrm
-mzc: fjb psb nfp
-sbj: mbz
-mts: dsj
-ggh: msr ckl
-rxq: hls qkp xnk
-qtc: hnh zbn ckl hkb
-cxq: mnx prb
-lmv: nsx sxj hgt cdb nnn
-zhl: dsg
-fjx: mxk mzf gbh
-ldp: zlx khd
-jhb: fhc pcc
-hpp: rjx sml stk ccd
-fxb: kgx
-fvf: mfz vrt rkb hgf csb hrf
-dfp: bkq dxp
-xnl: fvb hdg lfr jtl
-rjg: bsp ffr
-fcm: zkn
-xzl: bjg pfr
-pzp: sls rnq ftn mqs mzh
-pjd: bff jqh
-gfb: fhr zkn ncg jmj
-gcf: rll jcc pxs
-nkh: vrn drp stk
-frl: bkz fzv
-vfp: xkt bkv
-kmj: czl mpp
-lmq: czn sqz
-ndj: njr btx hjl
-njr: dfq fzv
-fnj: zvc tvf gks nnf xrm sxv
-xqb: qrr ctq
-cbh: cmh lcc qzz
-pnv: bqh fcn xrf dbj
-mjm: fdp
-vcr: pzv bfc fqc ngp kvb
-qng: nds vld cbq kzz
-dng: sgx
-njz: mzr czn kkz khd
-sfn: spr
-gzm: rgt qqf gtl
-bnc: qzz mzb
-xpp: xrl mhc qcb
-gkd: lmq
-sns: njk hrf fhc vnl
-ccd: rxr
-hsp: xgm lpp rbg cxq
-qrb: tgm scn zmz bgc
-nvf: crn jbm qfk
-gkn: vlk ktp dpj
-vgk: gxz
-jtg: svl kvl ptq npr
-hlx: sgj cjr xjm sdh
-hgn: dpg zlx cpn khg ppt
-dkb: fzq jhh
-gnd: vpj
-bcv: xhf ldr
-qqm: rxb klr mtb qqh
-zcg: fgs vqs ctf
-bmv: pjh mgx gmz gdp
-ddz: rhn lns fhj qhg
-zlr: bdr
-fml: dtp
-mzj: llm
-vlp: pkh
-mgx: jqh rmc rmk
-pmn: jlt
-lqh: lgz zpk
-zrc: pdg btx gtl
-qqt: ndz dkp
-nnx: kcp lfp hnq
-nqf: sdv tsr lrt
-rgz: tvj lxz zkm zrr tjp nzk
-zpk: tbg
-lbp: rnz
-bqh: zgz
-dlz: lrk
-vnp: fdp bjg gql
-gnt: qqj
-rqg: ttz
-pbt: gxh vgq kvf jtl xrf
-rxd: pxg jbx tmn
-tqh: qzv fpm
-jsr: zpr
-mzq: fqc csb scj mpt
-rjf: cbq svx sbk
-dvk: kjx mkq dpj
-fvb: msm
-dhl: xlf drz ddn xhh sjk
-btk: jhb jlp
-cbk: hjr nmc kgv rdx thc jfb
-dlg: cdp
-kcx: jqj fpm bhc lxv
-tcg: svg
-qbt: dpf rqn jbh jqr
-zdx: ljn bgx rnh zxq
-sqk: zrh gsx lrk
-jqs: pzg vzh
-jdj: pxp kcj htz rqm dvn mtr
-qdv: jsr kxz cjg
-pjs: slm vtb
-hlv: xml dfr zbh kkg
-vqm: vcd nrm pdd rlf xvp
-ccj: glm htz
-zlb: zrh klh zlg kbg
-srb: gnz hvg
-bgj: jqh jdz mlh
-kvj: vjs
-xcj: fqm gsn rnk qcr
-zzv: qcx mmm jzx hvs
-smh: csr jsx kcq
-fhq: tkj
-ktn: vvl jbs gqj vsh
-kbj: tqp crv rqx xhh
-str: bdp sbk fcn vgn
-hpk: bnd
-mhx: nrm pfc rhs txd znv bjm
-klc: kfl kgx jpm prd
-xbv: rpp mxc vlk fxb
-mjt: gcp grv
-qfn: zlb hps vjr
-bcf: hfb csb
-lkv: rnh vfc pxs zcf
-xbq: ppm ltr rzj kmr
-dms: vxk dgq kmd
-hqf: nvd tcg jsr zmt vxk
-sdv: lnx
-lqn: ntz zzb czp
-rlf: zrh
-ccs: xxq vpj zzb
-jln: kvl srn dbj
-gxk: phb
-jzx: lss tvj cjg prb
-mbj: qqj mrn
-xrl: lqs gql
-brx: npp prx pcm knb
-jtl: lfd
-qxm: zbb lzn zlp zjf hgt
-qkk: jjc tcr
-lpj: sbj jqg xjg
-svc: qdh qvl sml zcp
-qfv: kxb zkp
-tjz: tbh gnl jdf
-kps: stm
-dbf: vlk khm bld
-xtp: vfk tlb
-pkk: nft czp slm mjm
-vtq: gdz bpd dgq rxr brh
-qfb: dng dbj blz
-mzz: gmm pzg jgv
-vqn: rmd fgd hsg ktm
-hdx: qqf
-lxs: vgx dbn gbd
-ntq: nzh nsg
-vtb: jmb sqr
-drk: mpg gql fmt
-zvv: bcq dkc rmc zpf
-gdv: vxc rgt pzg
-gjl: psb
-lhx: fzv bgx
-sqr: cpf xxq
-qhr: pkh
-pfp: dtk
-xsb: btx xql njj
-jdf: cdp
-fgx: pjs gmz
-scx: bdr kjk zfb gmr htz
-rkv: szb
-rjq: lbs klh zkp bgf
-xkv: jtl rqx vld tnp
-rnp: hmc kcq dgx jbh
-dhp: gnf trv
-bzk: pxg pbc kbg njz xmk
-rkj: rpp ztz rbk
-tmn: xql xtk
-frd: zrd
-qcb: rbg
-lcf: tqp tmg
-ghp: qvl jsg jjc
-rpg: xsj tzb ldb bdr
-zpc: ckb fzt rhs spr rzv
-lvz: cmh
-dgc: mxl btg vjf
-jbd: tlb lkv xpk mgd
-csn: mbf
-vht: mzh lkg gqh
-rsr: lbp mns
-lgk: zrd
-zgt: mzh lgd svb vpj
-pcs: fdx tcx sdc npr hjl
-vbk: zkm mlh pcd vvl plr nvf
-jqg: ffj
-jlg: qcm dhr nhk cvh
-tqz: jhb
-dfz: mlh dbg qgj frz
-ptv: xgx tzl qpr jtl
-lfl: kfl ssq
-pxp: cbl
-ldr: rbk sln gmk
-rgd: mrq pjs gbr
-vkx: pdp tmg gvj grt
-hvk: mfs nss skv
-fvk: scs xjg
-ktt: qfd
-vvv: xgt ftx msr vfc
-nfb: pxj
-ndm: vjs
-lpp: jfj jgh
-rxv: sls kmd
-fbv: mkp nfc dtk gnx szb gkn bnd
-sjp: nds kcf khg bdr
-lgx: qdk qzz
-zlx: bxj tqz
-rtl: tqz lcf qfv fgq
-rrl: nzs tmg jcc
-mrg: qhr vds
-bld: vxf bkn fgx
-vfq: ffj
-gxm: lss
-tch: zbt kvb ggh mgd
-zzt: kcb pms jcg
-tqp: vpf crx
-vgf: cdr fcm jkv jpm
-jlj: pfp
-gcl: cqm gnl rcn jlj pdq
-qnv: xgc
-mbd: vrf ppm bjc zkm
-jgl: cpf dmt vkf
-vrs: hgv klv fvb ngm
-qvp: ngs dxg ngm cfc
-lpt: dql pxx lvk
-hzc: frl grv jjf gjp
-cdb: bjg
-sjl: kgf tct rsm
-fvj: clr bhh bnr xgc
-zbg: bpg tjs frd
-fsb: kgr vcq gxz
-dbt: ljn zbn vlp
-fnv: trv dkp
-rdx: jqg gxz dtm
-ssn: vqs dfs
-cnf: qmn hpp kqs fqb ghg
-bct: xlj cvg pbq vht
-dbr: dpm sfp brh kmd
-dff: gbh hzp kqf jbs
-xsd: jbm qdt
-zcs: jlp lhj bdp ldp
-mfz: kgr sjk
-gfj: cvv phb
-ljn: mzc gvj dfq hvg
-rmd: dgh dfs
-ttd: fmc zmz mzh
-qdh: ztz chl pmc mzh
-bfd: ktp vxr
-nxf: vjs gvj rlf
-tdn: mbz rlf
-mvn: dtg ldb sdc
-hkn: khd ndj xkt mxl zrh sgz vfq
-vqr: sgs ccd pmn kvn
-tkg: mct
-shh: hgl szh zmz qlc
-dsh: qtc qfb ndm gcq
-fkn: vbx gvx
-cmz: zdp scq mvb fkf
-fqv: lbb cnt rkt fnv
-hgf: qcd
-thj: mpp nvd mxc
-xjn: ngm vtn
-zln: dkp rqr rhp
-btg: xzt kvl
-rfl: kzk xvp pxk nfb bfc
-scm: jlk tzl vfc
-tvk: rcn lxx nvf mzj
-cqq: lpr kkz
-tcr: dkr
-sbk: kcf
-rnj: cqv zrr gql smm
-fkf: mzn clr
-khq: zpk bgj sbt
-crv: bls bqj mbx
-mml: lvg
-stp: kvj tnp lhs btk
-qdz: dpt dhp gdp dxp
-rmc: hmc
-rcn: gbd
-fcq: dmt zrd dtk lqn kqh
-xjg: hvg
-rzj: svg
-lkc: ldp pxf qqf
-mfx: hjs ctq skn
-gkv: vgx pjh bff
-rxl: vlk tnr
-hsg: fst gmr cvv
-dfr: qrs svr xfq lrt
-jqr: hvd
-zkq: rqg gnd kgf bll
-xgc: lvn bcl
-cjg: gfx
-brh: sgs
-pgg: nqp sls
-dxr: rmb
-gmr: ffr
-xnh: hgl
-vmp: zpf jlt
-gmm: bcl
-vzn: xpf tvg cqv
-ftf: dhr pvl zpr
-gck: hvd dgx bjc mhc
-fhk: cfc kvf
-rgv: sgq
-pht: kfp gxk rjf
-hzp: dmt sfq btt
-sxf: phb qfn rfm lcf tqm fhn
-msq: ctp tsf
-knc: hjp cbd rph
-jrf: lvn gmh zkp
-cbl: fhc gsx pxk
-nbv: hrs mjt xkt rjg
-pxl: gnj chl bmv
-vkc: gfx
-kgk: nrp qcd bss vxc tcn
-jjf: rlm vcz
-ndn: ssq
-pms: ndl pjx gfj
-btz: qcr tgc mds txn bdp mvb glm bzc
-xzq: mnx mjm fmt pfm
-lfr: lmq rrl
-ndz: brs cdb fmc dvp tcq
-sxj: jbh fcm
-fqd: czp
-pdh: drq bdr jxv gjl
-mnr: pqm fvk scm qtr btg
-ztt: scs zcv
-zvf: hrz jsg
-zxl: tvf rsz hgl rkt
-bkh: tbb qfd qdt frd
-gqh: hpp mpp jzz
-shj: kgx sml ncg mnx
-qlc: hfp
-sbt: nkh
-rhn: czp
-npb: klr frd fpm kkx
-zmx: vhj xgc ndd
-pmt: bxg xsd dlg
-qxc: tsr mpt
-znt: bln rsh
-rgt: tzg
-xlf: kvf vxc bls
-tgx: gqd szc zbn qrs
-sch: sbk
-pkl: nlz ntf kcp
-dfx: fxd jcg kgk lfd xml
-kxm: xck kkx rhn zdf cdb
-zhh: gqj
-hcq: ftz
-prd: zfx ltv mjg jsx
-lhj: kcf dfc
-pdd: rdr
-zhq: nsg mtm vft
-vcd: fhk jcc
-rhc: mrn hls xkl rxr vhg
-vts: rkv gmz spt
-lmj: fml sqz tbn
-mff: lvg
-dls: zhl qqf lpr xsz
-trs: pnj xhh kjl vkh
-rlm: rlf ffr
-btv: hhd
-jdz: xgh
-cnz: bgn qqh mtb
-sht: fvk nzs
-bjh: jdf ktt pcp
-ktj: nfj jbh tbh mml
-zkp: nhg
-bgf: mfx vrh
-ssf: ncg jkv jfj jqr
-svf: xhf vjt tvg
-chc: grb hps sdh ngs
-pvl: rpp
-bqv: kgf khm
-vlc: hvg vxb grk ftx hjc
-kkg: hfb
-jfb: zbn xtg xmk
-hrf: gsx
-tsz: xsd qtk pfr pjh
-jgv: gjl klv qrv pcl
-ltr: tkg qbf fbh
-rhs: vjf tqm chc
-zdf: tkj
-bbm: kgf qnp jpm mff qnx
-ddr: qqj
-mzf: lrr rxb
-gdp: npb xnh
-xmb: lbs qxc krc ndm jbd
-srj: pkh
-jsx: vrn
-gll: glm bzc
-mmm: nnn mzj kdl qnp
-stm: bjv
-pxj: dsj
-cvn: vds rzv
-zbb: fbp mzg ghp
-qts: nfg jln
-tnp: lcx
-jtz: jlt
-gzc: xpk qcr jrf rcj qgg
-dmp: bss jqg
-tdz: znt kzk
-ghn: zcf vgn mpt
-tth: rkv mtb mxc tng
-qjd: cbh pvp tcg pjh jbm
-fzv: sgj
-glv: nnc bzc
-lff: ntq vmp nsg xmd
-nhf: frl sps czq xsm
-tqj: sbt hkq rcn
-qjq: rmp
-dfc: mgr ptq
-mzr: tdq sgz
-gsl: vfd tmd ssf dtk xmz
-zdd: glm
-tmv: xrf vhp cqq svx
-zjk: sct tct xfc
-gsb: tzp rqm sgx lvn
-tzv: svg lhk bcq chl rhp
-ccr: xmd mml vlk
-vrf: qhg lgk lpz bhd
-tsr: xql
-zbn: hdx
-fxk: dlz sht hsr
-qnp: dgq
-mfq: mbf vtn hfz mxr
-rfx: sbj njj rjf slr zzt
-nds: hzn
-jdh: bqj nzs tbn ztt
-cgr: mxn mpp
-vjf: zcf qtf
-tpk: xgm rbg frz gdz
-qmx: czp gnl lpz bpd
-xkj: ffj
-xlh: dxr lqh zrz
-zqk: njr sqz ldj ppt xsb
-lrb: jcc ndd mbf
-kcj: xql nmc
-dmh: npb kxm nqp lzn
-nlx: mpd fxb txt pmt
-xql: nhg
-fsq: cqt krp sfl
-kqf: jph hpp vrj lvj
-npc: hfb gll zcg dgc
-scj: lnq
-vgq: sbj
-nnn: kqs dbn
-rmt: hnq ttd vts kvk
-pqc: ldj zlr kxb mfs
-tcn: znt krp prx szc
-pjf: jzq tgg svx psb
-gmj: mff dbn
-rct: qxd zdg cmh xxq
-dqc: vck gnt
-vgc: qls xvj bkr
-vnr: mrg bsp
-lsl: czp ddr
-ffd: sdl mkc tjs
-fht: vrt sfn pxj rxd
-dtg: tlb gmm bkz
-vvn: ndt klq spr cts ccj
-kdl: vdn kfs sgq
-cbn: hzn kxb hdx
-xhc: drk czp mzf rxl
-sfp: bgn bqv
-ckc: xxq kjx tjz qjq lvb qqt
-jzq: pcm gkd
-xns: ttz xrm
-cvp: kjx tjs ggj ttt
-ghf: vfc xvp rgt scm qfv
-tcx: kzk mfx
-qnx: nsg kcr zxl
-nmx: psb rff cbk pxk
-dkv: vgf szh mbj fbp
-mfv: vjr
-jzz: hfp rsr
-kvb: pcm bhh
-qcm: kps
-lvn: zbh
-sgz: fdl
-gnx: zqp lzm ckc
-rrn: gfj vqs xfq
-hpn: vnz vxr tcg dhr xrm
-xcp: vsx pvl fkn jsg
-crc: grk lhs vld dpg
-xbk: ngp
-vpf: jbr
-qfj: xkt
-mxn: gmk
-ltm: tdn kjk qcl
-qtj: rsh nrp zmx
-clr: pht
-nfc: kcq
-tvf: rhp lgd
-vvq: grt xvc jxv jjf
-njk: sht bxj ptq vgq
-xdz: ztj rgr zpr lqv
-mpq: qfj fjb lxk mvn vhp
-gxt: srb xvp tzg
-gnf: jvk vbx
-kcp: ktp
-gvd: gjq zlg mxl pxx txn
-vpm: zdf lrr rmb lmg
-ztf: fst bcf qnv sdv ndd
-lrz: csn xmh dxl
-qmv: qqm brh qdk mcs kkx jrj
-nzh: mml
-tsp: njr
-frz: fgx nrf
-fhj: gmk kgx
-lfp: kcr bgc xnk
-dpx: sls zdf bml
-kbp: zlr vlp zkp sjk
-bqk: znv vfq zcv rpb ctf
-plz: rsm cfn
-pns: qzz rhn phl qdv mrc pxl cmq
-mvb: nmc htd
-lzm: btv zpf
-ftn: lgd rbk
-qqs: dxx vnl lpt vfc
-tcq: qtk jsn
-nkq: knc vhq xgv fhn
-pvp: tbb vdn zvc
-xzt: ddn nnm
-grt: szc
-pdp: fgq scj hjl jlk
-fhr: jgh ndn
-glm: jrk
-fqj: ztz jlv jgl
-rmp: drk gnf
-njj: tsp hzn rqm
-jms: tjs qqj vln fnv
-hlm: qjq txt dbr jph pvl vck
-tzz: ftz csr zpk
-dpc: cvh
-msr: hjc xmk
-xzj: vxf lhk kpx srv tng
-sxd: kns bhd fnv
-ksb: ntl bxg jjv zpr sbt
-jtr: vrx szm tcp bcl
-kfp: dsj sch sfl zlr
-klr: dkr
-bpg: ksk jvk qls chl tkj
-hnn: ntc svg sgq lqv
-pgj: bjg szb
-rfj: kvm zsd clr lkn
-fjb: pjx
-nps: bjm mfz njk srb
-vkf: vgz tqh tbb
-lpz: hss ndn
-jlb: pkl vln rnz lgx
-zdg: jgs dgx
-gnz: lvp grt
-csr: trv
-rtt: xrf ddn csb
-fst: ffj qtj
-qgj: sfq btv
-bts: nhg gxz nhx dxl
-fpg: scj ddn nrp
-qpd: rxr gmk kmr
-jsf: fbp smh htv bpd
-mcs: lqf lhk
-hss: xkf jgs
-tlj: rmm jlg ccs xbq
-hbh: xsd mgx slm xlh
-bnr: krp bls pcl
-sct: hnq
-ccp: zrr ffx scf vnf
-ffr: fdl
-trg: qrr
-vrt: bcl
-glj: bqk lvn
-pgn: xjt skn kxk gcq xbk
-qkm: knb vjr glm
-rnz: mzb rxb
-ttt: pfm hgl tvg cqm
-hjb: pdq gqk stz vjt
-gqj: mzb
-bgn: qhg
-pbc: fvb rdt
-nxh: pzd xqd czg xzl
-fnx: shv gkd mgr
-rpd: jcb
-nsx: ctp rzj
-lqv: bxg dqc
-jcg: ppt
-fvd: scn lgk prb blr
-zmt: xsd vxk
-pdg: pxk mfv gkd xvc bsp
-sdl: qdt tvg jlj ntz
-kvm: trg
-rgr: kfl mxn
-tzb: qcl fcn pcc
-thb: dpf dkb dms
-vjj: vhj
-zxc: hhd sjh fhr rcn
-ldv: ntc hpk pmq zxc lgz rxv
-lrn: vdz lhk pdq qqj
-kmm: vhp lnx gpm smr xtg
-bgc: sxd sgs
-nfq: fmt ffv qcb
-vrx: srj bgx
-vzj: skv hsr mfv czn
-dcm: srv xkl
-lfb: vvl mgx jbm plz
-mzn: qcd sqz
-mds: dhk fpl
-bbj: kfs tkr zjf thb
-qmn: fqd bct mkq cdp ftn
-kpm: pfc htz
-vzx: brs
-pfc: vpp dqb hjp
-hvs: stk xlq zhh czl
-mrq: rkv
-vsx: fmc sjz
-bjm: mxh bzz qkm vgh zbn nck
-fth: rsd bjh csr dvp rqn
-lfd: gcq
-mxr: csb mzn vjs
-hcj: lvp nds gzm
-lrr: jlt lzn
-xgh: dcm lbp
-rmn: lxs xlq jtz kqs
-rmk: tsf
-dpm: jbh zhh
-mtr: zbn csn
-ntf: bgn lrn
-thl: hjc gkd jxv sgx rfm
-hnc: hgv
-hjj: vnp sfq vhg xgh jrm
-fhn: vrx vpf
-skn: rzv
-kss: vgq fpg ghn xtk
-tdq: tmg
-htz: fdx vfq lhx
-ctp: vhg bll
-fgq: sgx sgj
-cbv: sjp ztt nds gcf
-kvf: xml
-pfr: hvd zpr
-bsp: csn
-szh: ttz
-ccc: dvk cqm dpf gck
-ltv: gfx
-rph: scj ztk nck
-skz: xzl jqj vnp
-khd: npr
-mpd: gkv pjd drp
-kgm: crx hpt fsb kvf fsq
-tbg: zrz
-rgq: mcj nfp kpm lcx
-lqf: vgx bjg
-zlp: kvk kpx lss
-nck: btx
-gcp: rgt jrk
-pbl: ftz qxd
-klq: kbg sqk sjk vhj
-gbr: prd bkn
-lmd: kgr pnv trg
-jgb: zkn jmb
-rmb: mhc lgd jbh
+53906 14872
+35867 86182
+61313 43656
+23620 85315
+96434 90834
+70853 80045
+81024 46279
+74096 30947
+95143 21374
+58372 72621
+31935 12389
+49854 67579
+86609 43656
+89364 63407
+74266 14457
+52098 88395
+96964 96234
+49393 18203
+50534 68865
+15769 46056
+80451 31396
+74551 38740
+91700 86211
+93090 21692
+17501 34796
+16736 15045
+46056 37224
+75968 93912
+97701 75324
+28685 71207
+51195 28531
+74109 81902
+61906 30947
+61901 26456
+27949 31935
+80781 31935
+45869 63848
+76250 91948
+92161 88896
+92901 95050
+84135 56554
+36445 85108
+91602 50652
+14229 42099
+26675 53544
+31839 80370
+79535 80370
+36655 21828
+68093 10740
+49052 30403
+38777 87413
+10824 94461
+38968 80370
+63083 81902
+95411 55634
+69727 81902
+93596 70536
+52663 31396
+65999 68564
+59890 40680
+66226 43656
+94707 13595
+13899 79022
+25283 66901
+79946 33564
+80152 25915
+78359 38273
+28675 78207
+51401 24017
+21022 36263
+96272 97201
+22693 27307
+21648 97487
+46178 97979
+17466 60051
+82661 25915
+39775 93045
+48681 60562
+47199 86686
+30660 85874
+18285 69937
+55428 50228
+98906 13151
+86638 57318
+48728 66727
+78268 80222
+32191 18625
+75544 96995
+38692 27814
+51182 72597
+24564 14872
+78193 43656
+14830 98087
+51013 91047
+40389 62018
+80648 34735
+25915 48415
+75278 30947
+73740 76891
+47851 63741
+30743 93960
+30074 81716
+47127 31935
+66658 14609
+81404 13612
+78838 34796
+98988 56858
+61023 95843
+44069 79751
+58419 22373
+88253 33943
+10357 68564
+65647 75968
+56636 49814
+96378 30947
+61167 62569
+34557 37250
+64400 55670
+51614 31935
+12364 73721
+71834 63350
+11214 15293
+84197 67580
+46279 19369
+85435 25099
+87320 40454
+28341 16142
+65983 71345
+94333 79356
+66873 33981
+50771 31396
+91221 54646
+63742 34796
+99770 46279
+37731 80045
+20432 21157
+39263 76136
+99080 56687
+29242 32173
+93843 46279
+53850 18085
+68835 75005
+43354 40124
+48317 29974
+89326 97201
+75434 22373
+70473 25915
+63394 48255
+38016 68564
+78812 80045
+93261 58244
+20014 64971
+11924 11780
+21157 53840
+24802 89474
+55997 38754
+87219 25915
+20988 14872
+39639 28428
+29464 51586
+61672 78802
+96734 65594
+55764 14925
+52658 49815
+66306 81902
+19417 81326
+20305 17693
+33337 15419
+58435 11780
+88271 55426
+72760 70448
+62171 41784
+35420 75968
+85791 80045
+86874 28578
+47942 65464
+65982 43656
+54647 80045
+76794 72117
+71733 56858
+99560 97201
+57741 48255
+19684 38234
+82201 34796
+56598 81902
+78671 30403
+57520 81902
+28794 80045
+70718 36673
+12894 89585
+80420 88896
+75179 80045
+37527 94333
+68865 89708
+54484 70184
+22482 90992
+28787 99580
+23380 50228
+24819 34018
+23039 26417
+34777 30403
+38089 98258
+40091 90301
+65391 81902
+64984 88288
+47803 19170
+54239 23050
+89439 35940
+64104 15601
+42956 50228
+60123 42357
+62887 87025
+50719 56858
+60551 40959
+32730 73652
+80253 80045
+31948 19369
+33170 19369
+43380 88896
+66465 54668
+68963 25915
+74433 40124
+42272 11349
+45882 51505
+62636 26196
+97266 11220
+23083 96587
+27358 76569
+44481 81623
+11314 30728
+64712 57329
+95360 81902
+43100 83387
+22699 72297
+95680 57279
+12170 30947
+51297 59853
+48255 49975
+23355 34796
+55264 96834
+43234 95736
+58663 66937
+24467 93318
+31569 39898
+91720 37056
+17395 97253
+87456 68460
+61344 13591
+50316 50228
+50313 82900
+33328 41831
+70391 98955
+40124 13612
+80337 21838
+66151 17628
+14932 57871
+34464 48255
+18164 70338
+84969 14872
+30898 68564
+76526 11873
+41007 43656
+46997 52069
+74614 79205
+97267 80045
+13525 56858
+83587 23900
+70678 51307
+96613 20308
+39592 31396
+44365 91747
+44840 87970
+99891 90134
+58567 33972
+58851 43402
+87728 30403
+84786 37227
+13329 32507
+93229 90123
+43915 54511
+83982 27814
+19567 88896
+33979 87294
+40170 43656
+97852 48739
+45928 94736
+74935 28466
+97730 84011
+74826 95244
+68208 24359
+53130 92198
+41725 78978
+57089 11780
+98073 35872
+23652 11780
+97201 41849
+87155 71818
+88640 79810
+37745 21157
+14056 18175
+95658 56858
+48755 94333
+13619 45286
+81792 43656
+78244 31396
+30595 45955
+84035 95996
+60013 20192
+30544 13612
+94649 59748
+12343 75968
+37130 68564
+89486 25915
+30879 45350
+82252 76332
+72035 81326
+96757 39307
+12935 22093
+76836 96648
+13035 65492
+64394 56858
+68916 43656
+81474 31396
+90650 28126
+56290 94702
+35758 56672
+58825 41199
+55904 89015
+39969 10888
+45804 80699
+39063 33732
+71312 14949
+98164 36727
+83970 87031
+63860 15740
+19008 80045
+36342 59349
+75519 71974
+70509 49833
+15393 80714
+98995 85760
+80265 80370
+95001 42793
+28863 71880
+65186 59896
+91417 37319
+18213 74991
+46598 73652
+17350 56836
+77732 24742
+43239 96665
+91884 73652
+98023 17915
+30603 81326
+50132 72240
+14657 26301
+89888 46056
+29239 11140
+33269 80370
+86498 43609
+32323 18944
+87234 14483
+91312 84354
+55972 28052
+95671 44209
+47556 94712
+64231 92523
+40010 52869
+78889 65874
+65672 11780
+66829 27274
+58976 23077
+52684 99212
+12106 78809
+40894 79813
+73516 30403
+98758 90245
+78558 81135
+91842 43656
+36111 56858
+81902 57457
+57016 15315
+62322 31642
+12386 91620
+46583 57818
+16653 33234
+90664 13612
+99386 20422
+53504 20328
+88729 68564
+33262 89807
+22996 31396
+49944 21157
+71217 57474
+89409 93464
+81592 54135
+98029 75431
+54437 89337
+73652 85178
+44888 25915
+16495 94354
+20340 30974
+69933 86157
+23100 19122
+27337 71603
+81726 94579
+36381 80370
+13641 39385
+93685 32550
+73502 76018
+95815 49303
+26455 31396
+89509 94333
+43369 60492
+78840 66925
+84665 19369
+27145 30682
+20548 34796
+51087 84227
+24544 89081
+72048 57058
+70432 19369
+66825 40124
+30189 35430
+87176 89952
+69550 68440
+52304 27404
+22031 76800
+41939 80370
+30725 67957
+71537 22373
+53526 66477
+65213 20836
+51028 68564
+87427 46945
+18856 88896
+12027 68564
+28641 39589
+49464 72751
+15977 74910
+58898 75990
+39039 62184
+67691 57314
+60850 49736
+13012 48255
+84069 97201
+32568 68865
+96125 34796
+25181 74948
+73744 43656
+56977 21157
+80745 22716
+68012 34796
+47755 48255
+78533 29915
+23621 68865
+11353 43088
+84311 18978
+88935 20794
+54337 87927
+62396 46248
+83685 15158
+13519 40474
+89345 94333
+91712 56672
+54787 22373
+41442 19369
+57095 49689
+73305 68074
+40222 34796
+18020 22841
+62794 75878
+26368 14901
+11475 40124
+75682 74145
+75582 80370
+97642 80045
+43518 31396
+61262 14872
+65073 35575
+64250 41578
+41393 43656
+43735 59876
+52143 68865
+20553 52835
+88338 81503
+92669 68564
+97752 18898
+30830 94320
+13583 13612
+34097 54600
+95952 66295
+20902 68564
+35750 86876
+79359 57300
+19583 43538
+77422 21157
+63966 88896
+25403 57385
+71523 94333
+93579 11780
+35074 68865
+75840 48255
+44626 47096
+72438 60433
+54577 68564
+66690 56858
+41197 40124
+13612 30497
+25465 86662
+55920 78165
+89969 67123
+58286 70389
+43656 97260
+82249 43755
+30657 96171
+39157 31396
+18894 32478
+11955 10307
+43927 43656
+16920 50228
+29478 94333
+77022 17632
+33574 30653
+52142 59421
+43400 58568
+20918 21157
+59754 48255
+54975 74539
+45684 99214
+70895 33500
+68461 80541
+96575 26109
+39266 97201
+85211 31396
+62831 13612
+58008 89741
+52256 30403
+67407 31396
+11485 36725
+73476 43656
+28411 20566
+58997 24742
+50228 94333
+22731 49787
+60317 31396
+50387 56858
+47125 76520
+32596 40699
+86041 60374
+17153 93396
+47001 97796
+95064 33317
+60020 31715
+97079 13537
+95911 97201
+42771 30403
+31218 94333
+58019 68797
+27090 34796
+42716 89943
+13624 67333
+14872 41803
+15763 99088
+59386 71716
+29342 81287
+85955 37265
+92842 20523
+84757 75968
+76051 41922
+27595 46689
+74249 81347
+76224 97201
+46211 43561
+16434 31396
+95096 74640
+65042 56672
+89918 56858
+57601 94333
+45468 11780
+38812 25915
+51266 55991
+90185 75968
+75344 13612
+68758 50890
+54439 97201
+49138 21157
+72447 14872
+24656 40124
+94875 22613
+22373 43361
+44518 10761
+43686 60879
+32501 92097
+42849 13612
+96366 97201
+97664 18585
+75951 45638
+87742 55727
+26127 90094
+49148 29249
+44880 27199
+48351 34429
+49769 19369
+53310 31313
+97615 97700
+44217 70925
+35613 84873
+37774 33414
+37902 67163
+20513 31396
+22058 11456
+69695 43656
+12676 43656
+78546 44430
+93366 88781
+43779 79593
+42156 94062
+26825 30947
+61551 58309
+79992 80045
+70690 92191
+60303 33345
+47232 40844
+27958 75524
+65137 43403
+81422 88896
+90350 36543
+82498 21157
+34184 84567
+49629 78699
+52046 74192
+68564 51586
+74624 88896
+84055 35652
+78176 24112
+19369 81326
+29606 25074
+56381 25915
+41549 94333
+98646 77958
+10620 49796
+71804 80045
+70094 21157
+22047 43771
+26955 75968
+20916 46087
+70578 37746
+31396 85745
+38677 76047
+51586 80370
+33206 98673
+40909 76255
+86670 80370
+71335 29711
+90443 51586
+76017 23086
+64608 80370
+46749 24742
+89544 43543
+41857 46279
+42787 58205
+73907 67100
+62371 14872
+24918 98011
+51056 79598
+39721 34796
+67175 25915
+30403 36271
+64135 11780
+76994 78902
+66535 15092
+59032 94333
+75831 31184
+30096 11447
+23350 36783
+59712 31994
+38953 28778
+60226 50228
+82255 72338
+36348 68865
+76999 31396
+10164 31710
+15946 18029
+77511 30248
+95601 35450
+18152 49627
+32771 25915
+20404 31396
+61545 46279
+34285 87463
+84576 40124
+51878 51586
+88769 21515
+63200 81326
+68855 28497
+65595 53032
+48751 33285
+60205 88896
+96460 11367
+89979 80045
+11820 22373
+83877 11780
+20276 40124
+19438 81902
+94604 22373
+14247 67536
+89516 18681
+44165 80045
+58766 24742
+11456 26306
+11021 89613
+55218 59490
+74173 22743
+46876 80459
+63558 31935
+64004 24611
+72949 68564
+57103 62092
+95565 68564
+16875 38769
+81532 62587
+15150 22210
+74559 88896
+62813 61861
+29326 13612
+81512 68564
+49315 98827
+76486 25915
+42556 26135
+72818 52964
+24550 43656
+64689 70406
+73254 19265
+93699 68564
+53060 87046
+93009 81902
+39670 67615
+61036 67631
+45671 40413
+41312 80045
+49132 81902
+38018 91922
+71072 75073
+22869 27664
+55057 27814
+24941 27959
+84686 71679
+28947 74369
+25665 57496
+78778 23305
+14626 64462
+37342 43855
+59900 22416
+43285 98392
+92065 90613
+20557 68564
+45377 56858
+14449 55097
+97504 57790
+53508 80370
+39463 40124
+40767 68564
+64115 84078
+57015 38612
+10790 11780
+39059 48255
+97687 23054
+80185 40124
+42697 21344
+84512 30568
+88890 60974
+26625 25773
+23057 60654
+86691 40392
+19977 27723
+20885 35230
+82396 92827
+95747 20497
+70767 19369
+36646 58544
+55189 97285
+88283 66161
+61823 88896
+81975 98911
+96120 58310
+27584 13612
+29777 93381
+83851 81326
+68499 14896
+71570 80045
+83910 33934
+72510 19369
+29704 53243
+58042 94333
+10666 66744
+25477 38332
+46516 71338
+11780 81760
+60016 44454
+76061 88896
+45171 42137
+16022 31396
+43064 80370
+74174 94333
+75767 10987
+94834 41861
+43884 25498
+73079 82486
+49817 93178
+84945 88121
+37442 68004
+75204 52912
+88344 57580
+78701 55148
+79748 40124
+74272 34796
+32505 73879
+74004 40075
+97970 88796
+43969 81902
+34338 27951
+56706 51586
+70683 13612
+51351 41678
+15913 56236
+34587 11780
+27138 92114
+81477 85239
+37366 34453
+15828 68865
+29715 56858
+97538 80370
+16406 55594
+68956 18077
+21846 88896
+76758 36425
+59057 25915
+43840 82650
+67201 41066
+49427 70257
+41187 14872
+36754 24495
+23374 47449
+39822 68865
+66021 70536
+42652 43243
+24842 88896
+24280 24742
+88867 28631
+89241 86694
+23591 62627
+59260 48813
+50605 28489
+24330 84536
+25882 80024
+35776 62926
+54141 50228
+75680 40124
+84399 31530
+78265 80370
+87750 13922
+36091 75968
+27814 53359
+63430 34796
+63140 85215
+81319 68564
+89693 56300
+44939 86165
+78937 88896
+34287 57052
+60288 22373
+39738 97201
+66981 15143
+93466 85978
+43980 23335
+50378 24498
+65798 80045
+33048 70536
+74858 51594
+41614 26882
+78108 87082
+95851 39538
+55294 27347
+91809 51930
+18352 94333
+92466 41921
+20367 84778
+94765 21872
+70536 59326
+83561 73432
+80370 31935
+70474 44396
+96303 44391
+12398 89041
+23108 25947
+53083 21157
+99161 24742
+85566 15007
+32257 68564
+46065 50230
+63630 14872
+42636 97201
+94467 24904
+62773 20111
+56672 21157
+25886 30403
+13184 92058
+24742 94333
+69268 31396
+22434 77346
+12984 76178
+27117 43656
+10754 57124
+24873 75979
+39306 25915
+68234 84487
+17427 40124
+97952 20994
+33373 94333
+76327 14493
+45608 30947
+48367 22373
+54606 71965
+24726 25915
+10736 35060
+13367 53242
+95178 56815
+27296 56858
+68391 64705
+98563 38903
+20841 80370
+20931 11515
+60534 73652
+44041 90593
+39264 69166
+12510 77382
+65091 14872
+73605 78383
+43630 50005
+80045 78823
+17857 66318
+71065 13612
+67686 73652
+40016 11780
+96408 29692
+34507 81902
+10576 22373
+62967 92940
+68474 80370
+67663 49384
+27217 70536
+45444 94221
+16316 80370
+53563 68564
+76310 56858
+56858 69426
+96287 30104
+80543 29117
+82061 84323
+44833 20029
+58023 41150
+93209 56858
+19697 60022
+53393 23230
+97156 56858
+13069 63002
+72142 31122
+57137 49844
+48483 38592
+72970 69357
+93043 25915
+56792 15463
+73491 80370
+95205 30947
+84502 92854
+50655 31935
+81326 86245
+30947 21547
+81476 73108
+54995 86542
+88684 80659
+16695 77477
+67522 17661
+14444 24717
+48169 93182
+77304 62773
+10022 22838
+85352 68865
+88896 34807
+80571 21157
+75090 87473
+45429 57148
+38945 91244
+70349 21157
+13113 56858
+34796 40124
+32195 49176
+28292 57181
+14969 84572
diff --git a/src/main.rs b/src/main.rs
index cd815fb..1e553a3 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,182 +1,109 @@
#![allow(
confusable_idents,
uncommon_codepoints,
+ non_upper_case_globals,
internal_features,
mixed_script_confusables,
+ static_mut_refs,
incomplete_features
)]
#![feature(
slice_swap_unchecked,
generic_const_exprs,
+ iter_array_chunks,
+ get_many_mut,
maybe_uninit_uninit_array,
- inline_const,
- slice_flatten,
iter_collect_into,
let_chains,
anonymous_lifetime_in_impl_trait,
- unchecked_math,
array_windows,
slice_take,
test,
slice_as_chunks,
array_chunks,
slice_split_once,
- core_intrinsics,
- byte_slice_trim_ascii
+ core_intrinsics
)]
extern crate test;
pub mod util;
+use atools::prelude::*;
+use hinted::HintExt;
pub use util::prelude::*;
+fn p1(i: &str) -> impl Display {
+ static mut a: [i32; 1000] = [0; 1000];
+ static mut b: [i32; 1000] = [0; 1000];
-pub struct Graph {
- pub v: usize,
- pub edges: Vec<(usize, usize)>,
-}
-
-pub struct UnionFind {
- p: Vec<usize>,
- s: Vec<usize>,
-}
-
-impl UnionFind {
- pub fn new(size: usize) -> Self {
- Self {
- s: vec![1; size],
- p: (0..size).collect(),
- }
- }
-
- fn reset(&mut self) {
- self.s.fill(1);
- self.p
- .iter_mut()
- .enumerate()
- .for_each(|(idx, val)| *val = idx);
- }
+ let i = i.as_bytes();
+ unsafe {
+ for n in 0..1000 {
+ let i = C! { &i[n * 14..] };
+ let n1 = reading::八(
+ u64::from_le_bytes(util::nail(C! { &i[..8] })) << 24 | (0x3030303030303030 & !24),
+ ) as i32;
+ let n2 = reading::八(u64::from_le_bytes(util::nail(C! { &i[5..]}))) as i32;
- pub fn find(&mut self, key: usize) -> usize {
- if self.p[key] == key {
- return key;
+ *a.get_unchecked_mut(n) = n1;
+ *b.get_unchecked_mut(n) = n2;
}
- let parent = self.find(self.p[key]);
- self.p[key] = parent;
- parent
- }
-
- pub fn union(&mut self, a: usize, b: usize) -> bool {
- let α = self.find(a);
- let β = self.find(b);
- if α == β {
- return false;
- }
- let a = self.s[α];
- let b = self.s[β];
- if a >= b {
- self.s[α] += b;
- self.p[β] = α;
- } else {
- self.s[β] += a;
- self.p[α] = β;
- }
- true
- }
-
- fn group_size(&self, group: usize) -> usize {
- self.s[group]
+ radsort::sort(&mut a);
+ radsort::sort(&mut b);
+ a.iter()
+ .copied()
+ .zip(b)
+ .map(|(x, y)| (x - y).abs())
+ .sum::<i32>()
}
}
-pub fn karg(graph: &Graph) -> Option<usize> {
- let mut v = graph.v;
- let mut s = UnionFind::new(v);
- while v > 2 {
- let i = rand::limit::u64(graph.edges.len() as u64);
- let α = s.find(graph.edges[i.nat()].0);
- let β = s.find(graph.edges[i.nat()].1);
- if α == β {
- continue;
- }
- v -= 1;
- s.union(α, β);
- }
-
- let chop = graph
- .edges
- .iter()
- .filter(|&&(src, dest)| s.find(src) != s.find(dest))
- .count();
-
- if chop == 3 {
- let root = s.find(0);
- let size = s.group_size(root);
- return Some((graph.v - size) * size);
- }
- None
-}
+pub fn run(i: &str) -> impl Display {
+ static mut a: [u32; 1000] = [0; 1000];
+ static mut map: [u32; 100000] = [0; 100000];
+ let i = i.as_bytes();
-fn base26([a, b, c]: [u8; 3]) -> u32 {
- a.widen().widen() + b.widen().widen() * 26 + c.widen().widen() * 26 * 26
-}
+ unsafe {
+ let x = C! { &i[..14] };
+ let (x, y) = (reading::all(&x[0..5]), reading::all::<u32>(&x[8..13]));
+ *a.get_unchecked_mut(0) = x;
+ *map.get_unchecked_mut(y as usize) += 1;
-pub fn run(i: &str) -> impl Display {
- let mut z = 0;
- let mut n = HashMap::new();
- let mut e: HashMap<u32, HashSet<u32>> = HashMap::new();
- i.行()
- .map(|x| {
- let (k, v) = x
- .μ(':')
- .mr(|x| {
- x.split(|&x| x == b' ')
- .map(<[u8]>::trim_ascii)
- .filter(|x| !x.is_empty())
- .map(|x| base26(x.try_into().unwrap()))
- .collect_vec()
- })
- .ml(<[u8]>::trim_ascii)
- .ml(|x| base26(x.try_into().unwrap()));
- match n.entry(k) {
- Entry::Occupied(_) => {}
- Entry::Vacant(x) => {
- x.insert(z);
- z += 1;
- }
- }
- for j in v {
- match e.entry(k) {
- Entry::Occupied(x) => {
- x.into_mut().insert(j);
- }
- Entry::Vacant(x) => {
- x.insert(HashSet::from_iter([j]));
- }
- }
- match n.entry(j) {
- Entry::Occupied(_) => {}
- Entry::Vacant(x) => {
- x.insert(z);
- z += 1;
- }
- }
- }
- })
- .Θ();
- let mut edges = vec![];
- for (from, to) in e {
- for to in to {
- edges.push((n[&from], n[&to]));
- }
- }
- let g = Graph { edges, v: z };
- loop {
- if let Some(x) = karg(&g) {
- return x;
+ for n in 1..1000 {
+ let x = util::reading::八(
+ u64::from_le_bytes(util::nail::<8>(i.get_unchecked(n * 14 - 3..)))
+ & 0xffffffffff000000,
+ );
+ let y = util::reading::八(u64::from_le_bytes(util::nail::<8>(
+ i.get_unchecked(n * 14 + 5..),
+ )));
+ *a.get_unchecked_mut(n) = x as u32;
+ *map.get_unchecked_mut(y as usize) += 1;
}
+ a.iter()
+ .copied()
+ .map(|x| x * map.get_unchecked(x as usize))
+ .sum::<u32>()
}
+
+ // let (mut a, b) = i
+ // .行()
+ // .map(|x| x.κ::<u32>().carr().tuple())
+ // .collect::<(Vec<_>, Vec<u32>)>();
+ // let mut map = HashMap::<u32, u32>::default();
+ // for elem in b {
+ // map.entry(elem).and_modify(|x| *x += 1).or_insert(1);
+ // }
+ // a.sort_unstable();
+ // a.iter().map(|x| x * map.get(x).unwrap_or(&0)).sum::<u32>()
}
fn main() {
- let i = include_str!("inp.txt").trim();
+ // let mut s = String::new();
+ // for i in 0..1280 {
+ let i = include_str!("inp.txt");
+ // s.push_str(i);
+ // }
+ // std::fs::write("src/inp.txt", s);
+ println!("{}", p1(i));
+ // println!("{}", experiment(i));
println!("{}", run(i));
}
@@ -185,3 +112,9 @@ fn bench(b: &mut test::Bencher) {
let i = boxd(include_str!("inp.txt").trim());
b.iter(|| run(i));
}
+
+#[bench]
+fn bench2(b: &mut test::Bencher) {
+ let i = boxd(include_str!("inp.txt").trim());
+ b.iter(|| p1(i));
+}
diff --git a/src/util.rs b/src/util.rs
index 9170742..ad87491 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -1,10 +1,13 @@
#![allow(non_snake_case, unused_macros)]
+
+use rustc_hash::FxHashMap as HashMap;
+use rustc_hash::FxHashSet as HashSet;
use std::{
cmp::Reverse,
- collections::{hash_map::Entry, BinaryHeap, HashMap, HashSet},
+ collections::{hash_map::Entry, BinaryHeap},
fmt::{Debug, Display, Write},
hash::Hash,
- mem::{swap, MaybeUninit},
+ mem::swap,
ops::RangeInclusive,
str::FromStr,
};
@@ -13,17 +16,19 @@ pub mod prelude {
#[allow(unused_imports)]
pub(crate) use super::{bits, dang, leek, mat, shucks, C};
pub use super::{
- even, gcd, gt, l, lcm, lt, pa, r, rand, sort, Dir, FilterBy, FilterBy3, GreekTools,
- IntoCombinations, IntoLines, IterͶ, NumTupleIterTools, ParseIter, Printable, Push, Skip,
- TakeLine, Trunc, TupleIterTools2, TupleIterTools2R, TupleIterTools3, TupleUtils,
- UnifiedTupleUtils, UnsoundUtilities, Widen, 読む, 読む::Ext, Ͷ, Α, Κ, Λ, Μ,
+ even, gcd, gt, l, lcm, lt, pa, r, rand, reading, reading::Ext, sort, Dir, FilterBy,
+ FilterBy3, GreekTools, IntoCombinations, IntoLines, IterͶ, NumTupleIterTools, ParseIter,
+ Printable, Skip, TakeLine, TupleIterTools2, TupleIterTools2R, TupleIterTools3, TupleUtils,
+ UnifiedTupleUtils, UnsoundUtilities, Widen, Ͷ, Α, Κ, Λ, Μ,
};
pub use itertools::izip;
pub use itertools::Itertools;
+ pub use rustc_hash::FxHashMap as HashMap;
+ pub use rustc_hash::FxHashSet as HashSet;
pub use std::{
cmp::Ordering::*,
cmp::{max, min},
- collections::{hash_map::Entry, HashMap, HashSet, VecDeque},
+ collections::{hash_map::Entry, VecDeque},
fmt::{Debug, Display},
hint::black_box as boxd,
io::{self, Read, Write},
@@ -227,7 +232,7 @@ where
{
pub fn new(f: F) -> Self {
Self {
- 0: HashMap::new(),
+ 0: HashMap::default(),
1: f,
}
}
@@ -263,6 +268,8 @@ pub fn countg<N: Debug + PartialEq + Hash + Eq + Copy, I: Iterator<Item = N>>(
}
}
+// pub fn appearances(x: )
+
pub fn iterg<N: Debug + Copy, I: Iterator<Item = N>>(
start: N,
graph: &mut impl Fn(N) -> I,
@@ -283,7 +290,7 @@ pub fn show<N: Debug + Eq + Hash + Copy + Ord, I: Iterator<Item = (N, u16)>, D:
name: impl Fn(N) -> D,
) {
println!("digraph {{");
- let mut s = HashSet::new();
+ let mut s = HashSet::default();
let mut q = BinaryHeap::new();
q.push(Reverse((0, start)));
while let Some(Reverse((c, n))) = q.pop() {
@@ -314,7 +321,7 @@ pub fn dijkstra_h<N: Debug + Eq + Hash + Copy + Ord, I: Iterator<Item = (N, u16)
h: impl Fn(N) -> u16,
) -> u16 {
let mut q = BinaryHeap::new();
- let mut s = HashSet::new();
+ let mut s = HashSet::default();
q.push(Reverse((h(start), 0, start)));
while let Some(Reverse((_, c, n))) = q.pop() {
if end(n) {
@@ -339,7 +346,7 @@ pub fn dijkstra<N: Debug + Eq + Hash + Copy + Ord, I: Iterator<Item = (N, u16)>>
end: impl Fn(N) -> bool,
) -> u16 {
let mut q = BinaryHeap::new();
- let mut s = HashSet::new();
+ let mut s = HashSet::default();
q.push(Reverse((0, start)));
while let Some(Reverse((c, n))) = q.pop() {
if end(n) {
@@ -480,7 +487,7 @@ impl Λ for &str {
panic!(
"{e}: {self} should parse into {}",
std::any::type_name::<T>()
- );
+ )
}
}
}
@@ -593,6 +600,12 @@ impl PartialEq<RangeInclusive<u16>> for Ronge {
}
impl Ronge {
+ pub fn sane(self) -> bool {
+ self.end >= self.begin
+ }
+ pub fn checked_len(self) -> Option<u16> {
+ self.sane().then(|| self.len())
+ }
pub fn len(self) -> u16 {
self.end - self.begin
}
@@ -838,7 +851,6 @@ pub trait GreekTools<T>: Iterator {
fn ι1<N>(&mut self) -> impl Iterator<Item = (T, N)>
where
Self: Ι<T, N>;
- fn Ν<const N: usize>(&mut self) -> [T; N];
fn ν<const N: usize>(&mut self, into: &mut [T; N]) -> usize;
fn Θ(&mut self);
}
@@ -882,7 +894,37 @@ macro_rules! ι {
ι!(u64);
ι!(usize);
-pub mod 読む {
+pub fn nail<const N: usize>(x: &[u8]) -> [u8; N] {
+ unsafe { (x.as_ptr() as *const [u8; N]).read() }
+}
+
+pub mod reading {
+ #[inline]
+ pub fn 八(n: u64) -> u64 {
+ // reinterpret as u64 ("92233721" => 92233721)
+ // let n = u64::from_le_bytes(s);
+ // combine 4 pairs of single digits:
+ // split pieces into odd and even
+ // 1_7_3_2_ (le repr)
+ // _2_3_2_9
+ // then combine
+ // _21_37_23_92 (le repr, each byte as 2 digits)
+ let n = ((n & 0x0f000f000f000f00) >> 8) + ((n & 0x000f000f000f000f) * 10);
+ // combine 2 pairs of 2 digits:
+ // split again
+ // _21___23__
+ // ___37___92
+ // then combine
+ // __14|137__36|7 (le repr, pipes separating bytes)
+ let n = ((n & 0x00ff000000ff0000) >> 16) + ((n & 0x000000ff000000ff) * 100);
+ // combine pair of 4 digits
+ // split again
+ // __14|137____ (then moved to ______14|137, as u64:3721)
+ // ______36|07 (as u64: 9223)
+ // then combine
+ ((n & 0x0000ffff00000000) >> 32) + ((n & 0x000000000000ffff) * 10000)
+ }
+
use std::{
io::{self, Read},
ops::{Add, BitOrAssign, Shl},
@@ -1024,7 +1066,7 @@ pub mod 読む {
}
}
- pub fn 完了<
+ pub fn all<
T: Default + std::ops::Mul<T, Output = T> + Add<T, Output = T> + From<u8> + Copy + Ten,
>(
x: &[u8],
@@ -1047,20 +1089,6 @@ impl<T, I: Iterator<Item = T>> GreekTools<T> for I {
self.next().α()
}
- #[cfg_attr(debug_assertions, track_caller)]
- fn Ν<const N: usize>(&mut self) -> [T; N] {
- let mut array: [MaybeUninit<Self::Item>; N] =
- // SAFETY: mu likes this
- unsafe { MaybeUninit::uninit().assume_init() };
-
- for i in 0..array.len() {
- array[i].write(self.Δ());
- }
-
- // SAFETY: init
- array.map(|elem| unsafe { elem.assume_init() })
- }
-
fn ν<const N: usize>(&mut self, into: &mut [T; N]) -> usize {
let mut set = 0;
for e in into {
@@ -1178,21 +1206,6 @@ macro_rules! bits {
}
pub(crate) use bits;
-#[test]
-fn do_bits() {
- let mut bitset = 0u128;
- bits!(bitset + 5);
- assert!(bits!(bitset[5]));
- bits!(bitset ! 5);
- assert!(!bits!(bitset[5]));
- bits!(bitset ! 5);
- assert!(bits!(bitset[5]));
- bits!(bitset - 5);
- assert!(!bits!(bitset[5]));
- bits!(bitset[4] = true);
- assert!(bits!(bitset[4]));
-}
-
pub struct Lines<'a> {
bytes: &'a [u8],
}
@@ -1207,6 +1220,13 @@ impl<'a> Iterator for Lines<'a> {
impl<'a> std::iter::FusedIterator for Lines<'a> {}
+impl<'a> DoubleEndedIterator for Lines<'a> {
+ #[inline]
+ fn next_back(&mut self) -> Option<Self::Item> {
+ self.bytes.take_backline()
+ }
+}
+
pub trait IntoLines {
fn 行(&self) -> Lines<'_>;
}
@@ -1283,17 +1303,14 @@ pub fn sort<T: Ord>(mut x: Vec<T>) -> Vec<T> {
pub trait TakeLine<'b> {
fn take_line<'a>(&'a mut self) -> Option<&'b [u8]>;
+ fn take_backline<'a>(&'a mut self) -> Option<&'b [u8]>;
}
impl<'b> TakeLine<'b> for &'b [u8] {
fn take_line<'a>(&'a mut self) -> Option<&'b [u8]> {
match memchr::memchr(b'\n', self) {
None if self.is_empty() => None,
- None => {
- let line = *self;
- *self = b"";
- Some(line)
- }
+ None => Some(std::mem::replace(self, b"")),
Some(end) => {
let line = &self[..end];
*self = &self[end + 1..];
@@ -1301,17 +1318,25 @@ impl<'b> TakeLine<'b> for &'b [u8] {
}
}
}
+
+ fn take_backline<'a>(&'a mut self) -> Option<&'b [u8]> {
+ let end = self.len().checked_sub(1)?;
+ match memchr::memrchr(b'\n', &self[..end]) {
+ None => Some(std::mem::replace(self, b"")),
+ Some(end) => {
+ let line = &self[end + 1..];
+ *self = &self[..end];
+ Some(line)
+ }
+ }
+ }
}
impl<'b> TakeLine<'b> for &'b str {
fn take_line<'a>(&'a mut self) -> Option<&'b [u8]> {
match memchr::memchr(b'\n', self.as_bytes()) {
None if self.is_empty() => None,
- None => {
- let line = self.as_bytes();
- *self = "";
- Some(line)
- }
+ None => Some(std::mem::replace(self, "").as_bytes()),
Some(end) => {
let line = self[..end].as_bytes();
*self = &self[end + 1..];
@@ -1319,6 +1344,18 @@ impl<'b> TakeLine<'b> for &'b str {
}
}
}
+
+ fn take_backline<'a>(&'a mut self) -> Option<&'b [u8]> {
+ let end = self.len().checked_sub(1)?;
+ match memchr::memrchr(b'\n', &self.as_bytes()[..end]) {
+ None => Some(std::mem::replace(self, "").as_bytes()),
+ Some(end) => {
+ let line = &self[end + 1..];
+ *self = &self[..end];
+ Some(line.as_bytes())
+ }
+ }
+ }
}
pub trait IntoCombinations<T: Copy>: Iterator {
@@ -1361,34 +1398,6 @@ impl Skip for &str {
}
}
-pub trait Trunc<T, const N: usize> {
- /// it does `a[..a.len() - 1].try_into().unwrap()`.
- fn trunc(&self) -> [T; N - 1];
-}
-
-impl<const N: usize, T: Copy> Trunc<T, N> for [T; N] {
- fn trunc(&self) -> [T; N - 1] {
- self[..N - 1].try_into().unwrap()
- }
-}
-
-pub trait Push<T, const N: usize> {
- fn and(self, and: T) -> [T; N + 1];
-}
-
-impl<const N: usize, T> Push<T, N> for [T; N] {
- fn and(self, and: T) -> [T; N + 1] {
- let mut iter = self.into_iter().chain(std::iter::once(and));
- std::array::from_fn(|_| iter.next().unwrap())
- }
-}
-
-impl<T> Push<T, 1> for T {
- fn and(self, and: T) -> [T; 2] {
- [self, and]
- }
-}
-
/// WYRAND based rng's
pub mod rand {
/// WYRAND